PHP捕获致命错误的时候没有显示异常?
在PHP中自己想要试用自定义的异常处理函数捕获所有的错误处理,并且输出具有一定格式的错误信息,包括致命错误和非致命错误,在处理非致命错误上输出是没问题的,但是输出致命错误的时候,并没有输出,代码如下:
<?php
/**
* 使用自定义的异常处理函数,捕获所有的错误处理,包括非致命的和致命的
*/
// 屏蔽所有的错误显示
error_reporting(0);
// 使用自定义的异常处理函数来替代PHP的错误处理
set_error_handler('customError');
// 当PHP终止的时候(执行完成或者是遇到致命错误中止的时候)会调用FetalError方法
register_shutdown_function('FetalError');
/**
* 自定义的异常处理函数
* @param $errno int
* @param $errstr string
* @param $errfile string
* @param $errline int
* @throws Exception
*/
function customError($errno, $errstr, $errfile, $errline)
{
$res = PHP_EOL . " 错误代码: [${errno}] ${errstr}" . PHP_EOL;
$res .= " 错误所在的代码行: {$errline}";
$res .= " 文件: {$errfile}" . PHP_EOL;
$res .= " PHP版本:" . PHP_VERSION . "(" . PHP_OS . ")" . PHP_EOL;
// 自定义错误处理时,手动抛出异常
throw new Exception($res);
// echo $res;
}
/**
* 捕获致命错误
*/
function FetalError()
{
$err_info = error_get_last();
if ($err_info) {
customError($err_info['type'], $err_info['message'], $err_info['file'], $err_info['line']);
}
}
function test()
{
// Warning错误
// $a = 5 / 0;
// echo PHP_EOL;
// 这里报致命错误Fatal error
$a = new a();
echo PHP_EOL;
// 这里会报致命错误Fatal error
echo fun();
echo PHP_EOL;
echo "after";
echo PHP_EOL;
}
try {
test();
// 其他的业务逻辑,可能会抛出异常
} catch (Exception $e) {
var_dump(11111);
echo $e->getMessage();
}
运行之后什么都没有输出,而如果把customError方法的throw注释掉,换成echo $res,就没问题,请问为什么不能用throw?并且test方法里面的注释的那些非致命错误使用throw就可以正常输出的?为什么要用throw呢,这是因为try中除了test方法,可能还有其他的业务逻辑会抛出异常,所以我是打算把所有的异常和错误都在catch中进行捕获、错误输出以及错误处理,所以需要customError方法中进行throw抛出异常。
如果把error_reporting(0)注释掉,是可以显示的,如下:
λ php 1_25_allError.php
Fatal error: Uncaught Error: Class 'a' not found in C:\laragon\www\php_book\1_25_allError.php on line 67
Error: Class 'a' not found in C:\laragon\www\php_book\1_25_allError.php on line 67
Call Stack:
0.0000 355368 1. {main}() C:\laragon\www\php_book\1_25_allError.php:0
0.0000 355664 2. test() C:\laragon\www\php_book\1_25_allError.php:79
错误代码: [1] Uncaught Error: Class 'a' not found in C:\laragon\www\php_book\1_25_allError.php:67
Stack trace:
#0 C:\laragon\www\php_book\1_25_allError.php(79): test()
#1 {main}
thrown
错误所在的代码行: 67 文件: C:\laragon\www\php_book\1_25_allError.php
PHP版本:7.1.1(WINNT)
但是也会输出PHP自带的致命错误信息,我是想要屏蔽致命错误信息并且使用自定义异常处理函数即customError来输出致命错误信息的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
error_reporting(0)意味着关闭错误输出,这里不能关闭,关闭就不报错了。
register_shutdown_function
当PHP终止的时候执行,可以这样理解调用条件:那你的代码可以参考我上面的,记得关闭
display_errors
。不然PHP自己会输出错误。