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 对象是和 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
对象,该对象继承自 Error 对象。之前处理 eval()
的时候,对于潜在可能错误的代码除了检查返回值或者 error_get_last()
之外,还应该捕获 ParseError 对象。
内部对象的构造方法如果失败的时候总会报出异常。之前的有一些构造方法会返回NULL或者一个无法使用的对象。