PHP 7 错误处理机制修改

| 选择喜欢的代码风格  

现在有两个异常类:Exception and Error


PHP 7 现在有两个异常类,Exception and Error。这两个类都实现了一个新的接口:Throwable。在您的异常处理代码中,类型暗示可能需要调整下。

<?php
function add(int $left, int $right) {
    return $left + $right;
}
 
try {
    echo add('left', 'right');
} catch (Exception $e) {
    // Handle or log exception.
}

因为类型不一致导致上面的代码并不会捕捉 TypeException,从而得到了如下 Fatal Error 的提示

Fatal error: Uncaught TypeException: Argument 1 passed to add() must be of the type integer, string given

TypeException 的对象不会被 catch(Exception $e)捕获的原因并不明显。 Exception 后缀表示 TypeException 扩展了 Exception。 如果抛出的类的名称是 TypeError那么该类不会扩展 Exception 会更加清晰,而是必须单独捕获的不同类层次结构的一部分。

要捕获 TypeException,用户必须编写如下代码:

<?php
function add(int $left, int $right) {
    return $left + $right;
}
 
try {
    echo add('left', 'right');
} catch (Exception $e) {
    // Handle exception
} catch (TypeException $e) { // Appears to descend from Exception
    // Log error and end gracefully
}

一些致命错误和可恢复致命错误改为抛出Error对象


有一些致命错误和可恢复致命错误现在改为报出 Error 对象。Error 对象是和 Exception 独立的,它们无法被常规的 try/catch 扑获。编者按:需要注册错误处理函数,请参考下面的 RFC。

<?php
function add(int $left, int $right) {
    return $left + $right;
}
 
try {
    echo add('left', 'right');
} catch (Exception $e) {
    // Handle exception
} catch (Error $e) { // Clearly a different type of object
    // Log error and end gracefully
}

对于这些已经转为异常的可恢复致命错误,已经无法通过 error handler 静默的忽略掉。尤其是无法忽略类型暗示错误。

语法错误会抛出一个 ParseError 对象


语法错误会抛出一个 ParseError 对象,该对象继承自 Error 对象。之前处理 eval() 的时候,对于潜在可能错误的代码除了检查返回值或者 error_get_last() 之外,还应该捕获 ParseError 对象。

内部对象的构造方法如果失败的时候总会抛出异常


内部对象的构造方法如果失败的时候总会报出异常。之前的有一些构造方法会返回NULL或者一个无法使用的对象。

一些 E_STRICT 错误的级别调整


PHP 7 错误处理扩展阅读




发表评论