php 错误 异常,php中的异常和错误解析

PHP错误是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查甚至无法运行的情况。PHP异常一般是业务逻辑上出现的不合预期、与正常流程不同的状况,不是语法错误。本文介绍了php中异常和错误的相关资料,需要的朋友可以参考下。

一、异常与错误

异常是指程序运行中不符合预期情况以及与正常流程不同的状况。错误则属于自身问题,是一种非法语法或者环境问题导致的、让编译器无法通过检查设置无法运行的情况。

由于php最开始是没有异常处理,后来为了进军企业级开发,模仿java等语言,推出了异常。导致php中遇到任何自身错误都会触发一个错误,而不是抛出一个异常(某些情况下,会同时抛出错误和异常)。PHP一旦遇到非正常代码,大多数情况下,都是直接抛出错误,而不是异常。

php只有在你throw 一个异常后,才能用try...catch来捕获异常(一般情况下如此,也有部分异常可以自动捕获)。

在php中通常会在以下场景中使用异常:

1. 对程序的悲观预测:如果认为自己的代码无法一一处理各种可预见的情况、不可预见的情况。

2. 程序的需要和对业务的关注 : 如果对数据的一致性要求很高时,可以用try...catch把异常造成的逻辑中断破坏将到最小,并且经过补救处理后,不影响业务逻辑的完整性。

3. 语言级别的健壮性要求 : 通过精确控制运行时的流程,在程序中断时,有预见的用try...catch缩小可能出错的范围,及时捕获异常并做出相应的补救。

二、怎样看待php的异常

历史原因导致php的异常处理是不足的,绝大多数情况下,无法自动抛出异常,必须使用if...else先进行判断,再手动抛出异常。

手动抛出异常的意义不是很大,因为这意味着在代码里已经充分的预期到错误的出现。同时这种方式还会让你在复杂的逻辑判断和处理中晕头转向。导致失去异常真正的优点。

那么有更好的异常抛出方法吗?有,那就是结合使用错误

三、php中的错误

错误就是会使脚本运行不正常的情况。

在php中主要的错误等级如下:

1. deprecated: 最低级别的错误,表示"不推荐, 不建议"。例如在php 5中使用了ereg系列的正则函数就会出现。这类错误一般由于使用了不推荐的、过时的函数或语法造成。不影响程序正常运行,但建议修正。

2. notice: 一般指语法中存在不恰当的地方。如使用变量但是未定义就会报此错误。不影响程序正常流程。

3. warning: 较高级别的错误,在语法中出现很不恰当的情况才会出现此错误,比如函数参数不匹配。会导致得不到预期的结果,需要修改代码。

4. fetal error: 致命错误,直接导致程序终止运行。这类错误必须修改。

5. prase error: 语法解析错误,上面几种都属于运行时错误,此错误在运行前就会抛出。

在php中,总共有16错误级别,但是主要的就是上面几种。

error.php$data = '2012-12-20';

if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $data, $regs)) {

echo "$reg[3].$regs[2].$regs[1]";

} else {

echo "Invalid data format: $data";

}

$a = array('o' => 2, 4, 6, 8);

echo $a[o];

$result = array_sum($a, 3);

echo func();

echo '致命错误后,还会执行吗?';

//echo '最高级别错误', $55;

上面代码执行后,会有四个错误级别,如果你无法完全看到的话,你需要去修改你的ini配置文件中错误显示级别为 E_ALL

四、自定义错误处理程序

可以使用 set_error_handler() 函数来托管错误处理程序,可自行定制错误的处理流程。

如果要取消托管的话,可以在同一个页面中使用restore_error_handler()来取消托管。

如果想要自己抛出一个错误的话,可以使用trigger_error()函数。<?php

//自定义错误处理程序

function customError($errno, $errstr, $errfile, $errline)

{

echo "错误代码:[{$errno}] {$errstr}", PHP_EOL;

echo "错误所在代码行:{$errline} 文件{$errfile}", PHP_EOL;

echo "PHP版本", PHP_VERSION, "(", PHP_OS, ")", PHP_EOL;

}

set_error_handler("customError", E_ALL | E_STRICT);

$a = array('o' => 2, 4, 6, 8);

echo $a[o];

执行上面的代码,可以看到错误信息是由我们自定义的处理程序输出的,完全绕开了系统的处理程序。

如果错误发生在自定义处理程序前,则不会调用我们自定义的错误处理程序,所以应当先定义错误处理程序。

当然不是所有的错误级别都可以用set_error_handler来托管,如EERROR、EPARSE、ECODEWARNING、ECOMPILEERROR、ECOMPILEWARNING以及E_STRICT中的部分。这些错误信息会以原始的方式来显示或者不现实。

PHP把许多异常看作是错误,所以这些"异常"同样可以使用set_error_handler来接管:function customError($errno, $errstr, $errfile, $errline)

{

//自定义错误处理是,手动抛出异常

throw new Exception($errstr);

}

set_error_handler('customError', E_ALL | E_STRICT);

try {

$a = 5/0;

} catch (Exception $e) {

echo '错误信息:', $e->getMessage();

}

当然这种处理方式也有自己的优缺点:

缺点:

必须依靠程序员自己来掌控对异常的处理,对于异常的高发区、敏感区,如果程序员处理不好,就会导致业务数据不一致的问题。

优点: 可以获得程序运行时的上下文信息,以进行针对性的补救。

fetal error这样的错误无法捕获,也无法在发生后恢复流程处理,但是可以使用register_shutdown_function()函数在程序终止或die时触发一个函数,给程序带来一个短暂的回光返照。

在php4时,不支持析构函数,也常用于模拟实现析构函数。class Shutdown

{

public function stop()

{

if (error_get_laster()) {

print_r(error_get_laster());

}

die('Stop.');

}

}

register_shutdown_function(array(new Shutdown(), 'stop'));

$a = new a(); //致命错误,导致失败

echo '必须终止';

Parse error级别的错误,除了修改ini文件,将错误信息写到日志中,什么也做不了。

小结

php中错误和异常是两个不同的概念,这种设计根本上导致了php的异常和错误与其它语言相异。java中,异常时错误唯一的报告方式。说到底,两者的区别就是对异常的认识不同产生的。php异常绝大部分是通过某种方式手动抛出,才能捕获到。是一种半自动化的异常处理机制。

无论是错误还是异常,都可以使用handler接管系统已有的处理机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562914.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php变量原格式输出,PHP格式化输出打印变量

PHP 常用的输入变量函数print_r&#xff0c;但是输出没有换行&#xff0c;看起来很费力 我们可以自定义一个函数来实现变量的格式化输出&#xff0c;代码如下&#xff1a; function dump($vars, $label , $return false) {if (ini_get(html_errors)) {$content "\n&quo…

一个控制器2套模版php,如何不用一个自定义的控制器渲染一个模板

如何不用一个自定义的控制器渲染一个模板通常&#xff0c;当您需要创建一个页面&#xff0c;您需要创建一个控制器并且从该控制器中呈现模板。但如果您仅仅呈现一个简单的模板&#xff0c;并且不需要传递给它的任何数据&#xff0c;则完全没必要创建一个控制器&#xff0c;通过…

JAVA语言写的,用java语言写

Caballariistatic int argument;static int count0;public static void main(String[] args){argument5;printResult("",argument);System.out.println("总共"count"种");}public static void printResult(String result,int left){if(left1){Sy…

accept标头 php,解决PHP中缺少“授权”请求标头的问题

我目前正在为一个uni项目开发PHP REST API,该项目使用通过PhoneGap从移动Web应用程序传递的JSON Web令牌,或者在开发过程中使用我的桌面.使用ajax将令牌发送到我的服务器页面“ friends / read.PHP”时,服务器使用以下命令正确获取了Authorization标头$headers getallheaders(…

handsome对应php文件,基于handsome主题的一些美化总结

用了handsome主题有一段时间了&#xff0c;挺不错的主题!在无数次更换各种博客程序后最终还是选择使用Typecho&Handsome主题搭建博客如果长久发展的话建议就用wordpress进入正题:代码没标明的都是添加至handsome主题后台主题设置 自定义CSS。首页头像转动并放大.thumb-lg{w…

php语录网站,杨泽业:给你的wordpress博客添加经典语录功能,适合所有php网站

我们做一个网站就是要不断给访客提供最佳的用户体验&#xff0c;同时提升自己的品牌价值&#xff0c;而文章结束的经典语录的功能&#xff0c;完全可以实现我们所要达到的效果。(如下图)给你的wordpress博客添加经典语录功能这个是怎样实现的呢&#xff1f;其实很简单&#xff…

matlab搭建的应用层架构逻辑,软件设计的三层架构

1&#xff1a;三层架构是什么&#xff1f;三层架构是一个分层式的软件体系架构设计理念。把软件架构分为三层&#xff1b;1&#xff1a;UI层 (user interface layer) 界面层2&#xff1a;BLL层 (business logic layer) 业务逻辑层3&#xff1a;DAL层 (data access laye…

mysql null 0 空,MySQL的空值和NULL区别

从本质上区别&#xff1a;1、空值不占空间2、null值占空间通俗的讲&#xff1a;空值就像是一个真空转态杯子&#xff0c;什么都没有&#xff0c;而null值就是一个装满空气的杯子&#xff0c;虽然看起来都是一样的&#xff0c;但是有着本质的区别。例子&#xff1a;创建一个test…

mysql 数据库中数据去重,oracle数据库中如何达到像mysql数据库中group by 那种去重的效果..求大神解答...

满意答案oracle和mysql&#xff0c;group by是由区别的。oracle的gruop by 后跟的必须是select查询出的字段而且group by语句中select指定的字段必须是“分组依据字段”&#xff0c;其他字段若想出现在select中则必须包含在聚合函数中聚合函数比如&#xff1a;sum(列名) 求和ma…

强制关机对电脑的影响_笔记本电脑需要每天关机吗?长期开机对电脑有影响么?...

笔者之前写过一些选购笔记本的文章&#xff0c;就有不少网友问了这个问题&#xff1a;笔记本电脑需要每天关机么&#xff1f;一直开着有没有问题&#xff1f;这里说得一直开着是选择了合盖睡眠(或者休眠)的方式。使用时翻开笔记本盖子就可以工作&#xff0c;工作做完后合上盖子…

matlab 矩阵与向量乘,matlab问题,关于矩阵向量的乘问题

问题描述&#xff1a;matlab问题,关于矩阵向量的乘问题mxwtbx*T;mywtby*T;mzwtbz*T;%%%通过四元素解微分方程pmx.^2my.^2mz.^2;//这个地方有问题,我在下面说a1-p/8;b0.5-p/48;c(1)b*(a*q(1)/b-mx*q(2)-my*q(3)-mz*q(4));//提示这里有问题.c(2)b*(mx*q(1)a*q(2)/bmz*q(3)-my*q(4…

python关闭exe程序_Win 10 中使用 Python 碰到的奇怪现象

优质文章&#xff0c;第一时间送达&#xff01;作者&#xff1a;流光飞舞来源&#xff1a;https://shuhari.dev/blog/2019/11/win10-store-python最近在使用 Python 的时候发生了很奇怪的现象&#xff1a;从命令行执行 python.exe并不会进入 REPL&#xff0c;似乎也没有其他反应…

Matlab语音采集与读写程序,基于MATLAB的语音信号录制采集和分析的程序设计

理 论广 角 ● I 基于 MATLAB的语音信号录制采集和分析的程序设计 刘 晓炯 (西北民族大学电气工程学院 甘肃 兰州I 730030) [摘 要]语音信号处理技术是语音处理领域中新近发展起来的一个学科分支&#xff0c;MATLAB是一个数据分析和处理功能十分强大的工程使用软件&#xff0c;…

mulitpartfile怎么接收不到值_手机有时接收不到微信消息通知,怎么办?超全解决方案...

不知道大家在使用微信的过程中有没有遇到以下情况&#xff0c;在自己看视频或者刷其他网页的时候&#xff0c;没有接收到微信的任何通知和提示的消息。等到你进入微信页面后&#xff0c;突然发现有很多未读信息。这种情况时有发生&#xff0c;很多人都反应说微信接收消息总是会…

生活 list.php,list.php

require_once config.php;// 接收传来的分类id$categoryId$_GET[categoryId];//3// 查询当前分类下的文章// echo $categoryId;// 连接数据库$connectmysqli_connect(DB_HOST,DB_USER,DB_PWD,DB_NAME);// 写sql$sql"select p.id,p.title,p.feature,p.content,p.created,p.…

苹果呼叫转移设置不了_怎么设置别人电话打不进来

您可以尝试输入【**21*888888#】并按下拨打键&#xff0c;开启本机的呼叫转移功能&#xff0c;在开启之后别人拨打您的电话会转移到888888这个空号&#xff0c;实现别的电话无法打入的效果。以下就是相关的步骤介绍&#xff1a;1、只需要在安卓或者苹果iOS 11系统的手机的拨号界…

apache php日志配置,HTML_初学:apache与php基本配置,1、APACHE的日志主要分为“ - phpStudy...

1、APACHE的日志主要分为“错误日志”与“访问日志”。2、apache错误日志目录的设置&#xff1a;/etc/apache2/apache2.conf 约170行左右ErrorLog /var/log/apache2/error.log 错误日志将保存在error.log中ErrorLog /dev/null / 将错误日志指向空设备&#xff0c;那么就等于…

jdk db版本_企业视频会议系统音视频通话EasyRTC-SFU版本研发中更合适的配置文件格式-TOML配置介绍 - TSINGSEE...

在 EasyRTC-SFU 版本的开发过程中&#xff0c;很多配置需要存储在配置文件中。开发人员经常使用的配置文件有 ini、json、xml、yaml 等格式&#xff0c;在综合分析各种文件格式的优劣后&#xff0c;我们最终确认使用 toml 格式作为配置文件格式。ini 文件格式是最传统的配置文件…

PHP开源管理系统 Gms,GMS 一个成熟的gms系统,拥有基本的权限管理和分类,后台很好 Windows Develop 249万源代码下载- www.pudn.com...

文件名称: GMS下载 收藏√ [5 4 3 2 1 ]开发工具: PHP文件大小: 14012 KB上传时间: 2016-01-03下载次数: 0提 供 者: 马继康详细说明&#xff1a;一个成熟的gms系统,拥有基本的权限管理和分类&#xff0c;后台很好-a good gms system文件列表(点击判断是否您需要的文件&a…

numpy序列预处理dna序列_个人隐私DNA亲子鉴定序列

个人隐私DNA亲子鉴定序列DNA亲子鉴定是基于医学&#xff0c;法律或个人原因解决亲子关系的最先进&#xff0c;最准确的方法。周转时间&#xff1a;凭借先进的DNA技术&#xff0c;亲子鉴定准确&#xff0c;快速且价格合理。现在可以在样品到达实验室后的3至7个工作日内确定亲子关…