百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>网页制作> 剖析PHP差错处置(中心特性)
分享文章到:

剖析PHP差错处置(中心特性)

发布时间:09/01 来源:未知 浏览: 关键词:

错误与非常

错误,可以懂得程序本身的错误,例如语法错误。而非常则更偏向于程序运转不相符预测或者不相符正常流程;关于 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_ERRORE_PARSEE_CORE_ERRORE_CORE_WARNINGE_COMPILE_ERRORE_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错误处置(中心特性)的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有151人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板