示例一:
php版本:7.1.17
<?php
try{
//test类不存在
new test();
}catch(Throwable $e){
var_dump($e->getPrevious());
var_dump($e->getMessage());
}
var_dump("hello php7");
运行结果:
示例二:
php版本:5.6.38
<?php
try{
new test();
}catch(Throwable $e){
var_dump($e->getMessage());
}
var_dump("hello php5");
运行结果:
同样类不存在的错误,php7中是可以通过try{}catch()捕获的到。php5中直接中止程序运行。
官方解释:(地址:http://php.net/manual/zh/language.errors.php7.php)
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。
当然如果是语法错误等一些编译错误。php5和php7都将直接中止错误。
在生产环境中一般都将php的错误显示级别(display_errors)设置为off,即不显示所有错误,直接报500错误,因此需要通过php的内置函数来记录错误或者异常。
函数如下:
- set_error_handler() 设置用户自定义处理错误的函数。(官方文档地址:http://www.php.net/manual/zh/function.set-error-handler.php)
- register_shutdown_function() 设置一个在php中止前执行的函数(官方文档地址:http://www.php.net/manual/zh/function.register-shutdown-function.php)
- set_exception_handler() 设置默认的异常处理函数,如果程序中止前没有程序来捕获异常,将出发该函数。(官方文档地址:http://www.php.net/manual/en/function.set-exception-handler.php)
官方文档中已有详细使用教程,此处不宜赘述。个人理解不喜勿喷。