错误处理变更
1. 现在有两个异常类型: Exception 与 Error, 均实现了新接口 Throwable.
异常处理代码中的类型提示可能需要变更以应对这种变化.
2. 部分 fatal errors 与 recoverable fatal errors 改为抛出 Error.
由于 Error 是一种不同于 Exception 的类, 所以这一部分异常不会被现有的try/catch代码块捕获.
那些被转换成异常的recoverable fatal errors, 现在不能在错误处理函数中静默忽略. 尤其不能忽略类型提示错误.
set_exception_handler()
不再保证收到的一定是 Exception 对象.
抛出 Error 对象时, 如果 set_exception_handler()
里的异常处理代码声明了类型Exception, 将会导致 fatal error.
想要异常处理器同时支持 PHP5 和 PHP7, 应该删掉异常处理器里的类型声明。如果代码仅仅是升级到 PHP7, 则可以把类型 Exception 替换成 Throwable.
// PHP 5 时代的代码将会出现问题
function handler(Exception $e) { ... }
set_exception_handler('handler');
// 兼容 PHP 5 和 7
function handler($e) { ... }
// 仅支持 PHP 7
function handler(Throwable $e) { ... }
3. 解析错误现在会抛出继承于Error的ParseError.
对于eval()有潜在不合法代码的错误处理,除了检查返回值与error_get_last(),还应该捕获ParseError.
4. 现在内部类构造失败总是抛出异常. 之前部分构造方法会返回NULL或不可用对象.
5. 部分E_STRICT提示的错误级别发生变更.
Relevant RFCs: engine_exceptions_for_php7 throwable-interface internal_constructor_behaviour reclassify_e_strict