PHP 7 错误处理

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并非继承自 Exception 类,所以不能用 catch (Exception $e) { ... } 来捕获 Error。你可以用 catch (Error $e) { ... },或者通过注册异常处理函数( set_exception_handler())来捕获 Error

Error 层次结构

  • Throwable
    • Error
      • ArithmeticError
        • DivisionByZeroError
      • AssertionError
      • ParseError
      • TypeError
    • Exception
      • ...
add a note add a note

User Contributed Notes 6 notes

hungry dot rahly at gmail dot com
2 years ago
You can catch both exceptions and errors by catching(Throwable)
demis dot palma at tiscali dot it
1 year ago
Throwable does not work on PHP 5.x.

To catch both exceptions and errors in PHP 5.x and 7, add a catch block for Exception AFTER catching Throwable first.
Once PHP 5.x support is no longer needed, the block catching Exception can be removed.

   // Code that may throw an Exception or Error.
catch (Throwable $t)
   // Executed only in PHP 7, will not match in PHP 5
catch (Exception $e)
   // Executed only in PHP 5, will not be reached in PHP 7
lubaev dot ka at gmail dot com
1 year ago
php 7.1

try {
   // Code that may throw an Exception or ArithmeticError.
} catch (ArithmeticError | Exception $e) {
   // pass
ryan dot jentzsch@{gmail} dot com
7 months ago
An excellent blog post on the difference between exceptions, throwables and how PHP 7 handles these can be found here:
9 months ago
Maybe you want to suppress warnings in errlog? If so, then just prepend function name with @ sign.
Egor Gubanov
1 year ago
What should I do to let the program to react to warnings? I've already tried to write try/catch construction, but it doesn't working.
To Top