PHP 核心特性 - 错误处理
错误与异常错误,可以理解程序本身的错误,例如语法错误。而异常则更偏向于程序运行不符合预期或者不符合正常流程;对于 PHP 语言而言,处理错误和处理异常使用的机制完全不同,因此很容易让人产生困惑。 例如,我们希望通过捕获异常来处理除数为 0 的情况,但是在捕获到异常之前,PHP 就触发了错误。 1 try {
2 $a = 5 / 0;
3 } catch (Exception $e) {
4 $e->getMessage();
5 $a = -1; // 通过异常来处理 $a 为 0 的情况,但是实际上,捕获不到该异常
6 }
7
8 echo $a;
9 // PHP Warning: Division by zero
也就是说,PHP 将除数为 0 的情况当成了错误而触发,而不会自动抛出异常,因此没法捕获。类似的,在很多情况下,PHP 都没办法自动抛出异常。只能通过 上述情况的发生,主要还是因为异常机制是 PHP 向面向对象演进后得到的产物。而在此之前 PHP 的报错主要还是通过错误机制,因此,在很多情况下,PHP 的错误要比异常更有价值。不过 PHP7 开始统一这两者,使错误也可以像异常那样抛出(这部分内容将放在异常部分讲解)。 错误级别PHP 中的错误可理解为使脚本不运行不正常的情况,根据错误级别从高到低可划分为五类
默认情况下,PHP 触发错误,并显示错误的级别及对应的提示。 Parse Error 示例 - 语句结尾不写分号 1 echo "abc" 2 // PHP Parse error: syntax error,unexpected end of file,expecting ',' or '; Fatal Error 示例 - 使用不存在的函数 1 echo "beforen"; 2 foo(); 3 echo "after"; // 本行无法继续执行 4 // before 5 // PHP Fatal error: Uncaught Error: Call to undefined function foo() Warning Error 示例 - 引入不存在的文件 1 $a = "foo";
2 include('bar.php');
3 echo $a; // 程序继续执行
4 // PHP Warning: include(bar.php): failed to open stream: No such file or directory ...
5 // foo
6 Notice Error 示例 - 输出不存在的变量
7
8 echo $foo;
9 echo 12345;
10 // PHP Notice: Undefined variable: foo
11 // 12345
Deprecated Error 示例 - 在一些字符串函数中传入数字而非字符串 1 strpos('12345',3);
2 // PHP Deprecated: strpos(): Non-string needles will be interpreted as strings in the future
除了默认触发消息外,用户也可以使用 1 set_error_handler ( callable $error_handler [,int $error_types = E_ALL | E_STRICT ] ) : mixed 示例 1 <?php
2 // E_ALL - 处理全部错误类型
3 set_error_handler('customError',E_ALL);
4
5 /**
6 * @param int $errno 错误的级别
7 * @param string $errstr 错误的信息
8 * @param string $errfile 错误的文件名(可选)
9 * @param string $errline 错误发生的行号(可选)
10 */
11 function customError(int $errno,string $errstr,string $errfile,string $errline)
12 {
13 echo sprintf('错误消息为 %s',$errstr);
14 }
15
16 $a = 5 / 0; // 错误消息为 Division by zero
用户也可以通过 1 function division($a,$b) {
2 if($b == 0){
3 @trigger_error("0 不能作为除数",E_USER_NOTICE);
4 return -1;
5 }
6 return $a / $b;
7 }
8
9 echo division(10,0);
与错误有关的配置一些错误处理相关的常用配置
《Modern PHP》提出了四个规则
开发环境推荐配置 1 display_errors = On 2 display_startup_error = On 3 error_reporting = -1 4 log_errors = On 生产环境推荐配置 1 display_errors = Off 2 display_startup_error = Off 3 ; 报告 Notice 以外的所有错误 4 error_reporting = E_ALL & ~E_NOTICE 5 log_errors = On 6 Symfony 编码规范相关异常和错误消息字符串必须使用
当错误类型为
参考资料
(编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
