在PHP中自己想要試用自定義的異常處理函數(shù)捕獲所有的錯誤處理,并且輸出具有一定格式的錯誤信息,包括致命錯誤和非致命錯誤,在處理非致命錯誤上輸出是沒問題的,但是輸出致命錯誤的時候,并沒有輸出,代碼如下:
<?php
/**
* 使用自定義的異常處理函數(shù),捕獲所有的錯誤處理,包括非致命的和致命的
*/
// 屏蔽所有的錯誤顯示
error_reporting(0);
// 使用自定義的異常處理函數(shù)來替代PHP的錯誤處理
set_error_handler('customError');
// 當(dāng)PHP終止的時候(執(zhí)行完成或者是遇到致命錯誤中止的時候)會調(diào)用FetalError方法
register_shutdown_function('FetalError');
/**
* 自定義的異常處理函數(shù)
* @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();
// 其他的業(yè)務(wù)邏輯,可能會拋出異常
} catch (Exception $e) {
var_dump(11111);
echo $e->getMessage();
}
運行之后什么都沒有輸出,而如果把customError方法的throw注釋掉,換成echo $res,就沒問題,請問為什么不能用throw?并且test方法里面的注釋的那些非致命錯誤使用throw就可以正常輸出的?為什么要用throw呢,這是因為try中除了test方法,可能還有其他的業(yè)務(wù)邏輯會拋出異常,所以我是打算把所有的異常和錯誤都在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自帶的致命錯誤信息,我是想要屏蔽致命錯誤信息并且使用自定義異常處理函數(shù)即customError來輸出致命錯誤信息的。
- 1 回答
- 0 關(guān)注
- 481 瀏覽
添加回答
舉報
0/150
提交
取消