分析PHP错误处理(核心特性)-php教程

资源魔 62 0

谬误与异样

谬误,能够了解顺序自身的谬误,例如语法谬误。而异样则更倾向于顺序运转没有合乎预期或许没有合乎失常流程;关于 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 Co妹妹andNotFoundException(sprintf('Co妹妹and "%s" does not exist.', $name));

当谬误类型为 E_USER_DEPRECATED 时,需求增加 @

@trigger_error("foo", E_USER_DEPRECATED);

更多相干php常识,请拜访php教程!

以上就是剖析PHP谬误解决(外围特点)的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学

抱歉,评论功能暂时关闭!