为了账号安全,请及时绑定邮箱和手机立即绑定

PHP捕获致命错误的时候没有显示异常?

PHP捕获致命错误的时候没有显示异常?

PHP
桃花长相依 2019-03-18 18:09:43
在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来输出致命错误信息的。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 472 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信