PHP 7.1.18 Released

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 7 notes

up
71
hungry dot rahly at gmail dot com
2 years ago
You can catch both exceptions and errors by catching(Throwable)
up
33
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.

try
{
   // 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
}
up
6
ryan dot jentzsch@{gmail} dot com
9 months ago
An excellent blog post on the difference between exceptions, throwables and how PHP 7 handles these can be found here: https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
up
10
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
}
up
1
wr_sorarara at yahoo dot co dot jp
7 days ago
the node said that i can get the error by catch{Error $e}block or a set_exception_handler() handler is required.
here is my code:
try{
    array_key_exists('key',null);
}
catch(\Throwable | \Error | \Exception $e){
    echo 'hello error';
}

I deliberately wrote a warning code and the output is "Warning: array_key_exists() expects parameter 2 to be array, null given in"

the result i want is "hello error" but i didn't get it.

and in the other code :
set_error_handler('show_error');

try{
    array_key_exists('key',null);
}
catch(\Throwable | \Error | \Exception $e){
    echo 'hello error';
}

function show_error(\Error $e){
    echo "show_error:"
    echo $e->getMessage();
}

the output is "hello error".

i don't know how the error can be caught  by the catch block.
up
-58
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.
up
-53
Teo
11 months ago
Maybe you want to suppress warnings in errlog? If so, then just prepend function name with @ sign.
To Top