剖析PHP差错处置(中心特性)
错误与非常
错误,可以懂得程序本身的错误,例如语法错误。而非常则更偏向于程序运转不相符预测或者不相符正常流程;关于 PHP 说话而言,处置错误和处置非常使用的机制完全不一样,因此很容易让人发生困惑。
例如,我们但愿通过捕捉非常来处置除数为 0 的状况,但是在捕捉到非常此前,PHP 就触发了错误。
try { $a = 5 / 0; } catch (Exception $e) { $e->getMessage(); $a = -1; // 通过非常来处置 $a 为 0 的状况,但是实际上,捕捉不到该非常 } echo $a; // PHP Warning: Division by zero
也就是说,PHP 将除数为 0 的状况当做了错误而触发,而不会主动抛出非常,因此没法捕捉。相似的,在许多状况下,PHP 都没方法主动抛出非常。只能通过 if - else 语句推断再结合 throw 办法来并手动抛出非常。
上述状况的发生,主要还是由于非常机制是 PHP 向面向对象演进后得到的产物。而在此此前 PHP 的报错主要还是通过错误机制,因此,在许多状况下,PHP 的错误要比非常更有价值。不外 PHP7 开端统一这两者,使错误也可以像非常那样抛出(这部分内容将放在非常部分讲解)。
错误级别
PHP 中的错误可懂得为 使足本不运转不正常的状况,按照错误级别从高到低可划分为五类
1.Parse error
或 Syntax Error
- 语法解析错误,触发该错误后,足本完全没法运转;
2.Fatal Error
- 致命错误,触发该错误后,后面的足本没法连续施行;
3.Warning Error
- 显现比力不适当的地方,足本可连续施行;
4.Notice Error
- 显现不适当的地方,但是程度比 Warning Error 低,足本可连续施行;
5.Deprecated Error
- 不引荐这么使用,将来大概会废弃,足本可连续施行;
默许状况下,PHP 触发错误,并显示错误的级别及对应的提醒。
Parse Error
示例 - 语句结尾不写分号
echo "abc" // PHP Parse error: syntax error, unexpected end of file, expecting ',' or ';
Fatal Error
示例 - 使用不存在的函数
echo "before\n"; foo(); echo "after"; // 本行没法连续施行 // before // PHP Fatal error: Uncaught Error: Call to undefined function foo()
Warning Error 示例 - 引入不存在的文件
$a = "foo"; include('bar.php'); echo $a; // 程序连续施行 // PHP Warning: include(bar.php): failed to open stream: No such file or directory ... // foo Notice Error 示例 - 输出不存在的变量 echo $foo; echo 12345; // PHP Notice: Undefined variable: foo // 12345
Deprecated Error
示例 - 在一些字符串函数中传入数字而非字符串
strpos('12345', 3); // PHP Deprecated: strpos(): Non-string needles will be interpreted as strings in the future
除了默许触发新闻外,会员也可以使用 set_error_handler 函数自定义错误处置,大多数错误类型都可以停止自定义处置,除了 E_ERROR
、 E_PARSE
、 E_CORE_ERROR
、 E_CORE_WARNING
、 E_COMPILE_ERROR
、 E_COMPILE_WARNING
外。
set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) : mixed
示例
<?php // E_ALL - 处置全部错误类型 set_error_handler('customError', E_ALL); /** * @param int $errno 错误的级别 * @param string $errstr 错误的信息 * @param string $errfile 错误的文件名(可选) * @param string $errline 错误发生的行号(可选) */ function customError(int $errno, string $errstr, string $errfile, string $errline) { echo sprintf('错误新闻为 %s', $errstr); } $a = 5 / 0; // 错误新闻为 Division by zero
会员也可以通过 trigger_error 函数来手动触发一个会员级别的错误(E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE、E_USER_DEPRECATED)。
function division($a, $b) { if($b == 0){ @trigger_error("0 不克不及作为除数", E_USER_NOTICE); return -1; } return $a / $b; } echo division(10, 0);
与错误有关的配置
一些错误处置相关的常用配置
● error_reporting
- 设定错误的报告级别
● display_errors
- 可否显示错误
● display_startup_error
- 可否显示 PHP 启动历程中的显示
● log_errors
- 设定可否将足本运转的错误信息记载到效劳器错误日志或者 error_log 之中
《Modern PHP》提出了四个规则
● 必然要让 PHP 报告错误;
● 在开发环境中要显示错误;
● 在生产环境中不克不及显示错误;
● 在开发环境和生产环境中都要记载错误;
开发环境引荐配置
display_errors = On display_startup_error = On error_reporting = -1 log_errors = On
生产环境引荐配置
display_errors = Off display_startup_error = Off ; 报告 Notice 之外的所有错误 error_reporting = E_ALL & ~E_NOTICE log_errors = On
Symfony 编码标准相关
非常和错误新闻字符串必需使用 sprintf
来停止拼接;
throw new CommandNotFoundException(sprintf('Command "%s" does not exist.', $name));
当错误类型为 E_USER_DEPRECATED
时,需要增加 @
@trigger_error("foo", E_USER_DEPRECATED);
更多相关php知识,请拜访php教程!
以上就是剖析PHP错误处置(中心特性)的具体内容,更多请关注百分百源码网其它相关文章!