1 回答

TA貢獻1847條經驗 獲得超11個贊
并非所有錯誤都轉換為ThrowablePHP 7 中的錯誤。
實際上,文檔說:
大多數錯誤現在通過拋出錯誤異常來報告。
(強調我的)。大多數 !== 全部。
有些錯誤仍然無法捕捉。
有趣的是,在 PHP 7.1 發布之前,您習慣于說“可捕獲的致命錯誤”而不是“可恢復的致命錯誤”的錯誤消息。
這被報告為錯誤,但開發人員實施的解決方案是將錯誤字符串從Catchable更改為Recoverable以消除誤解。
在您正在測試的特定情況下,似乎phpinfo()引發 arecoverable error而不是拋出 an Error,因此您無法以這種方式捕獲它是有道理的。
盡管如此,并不是所有的希望都破滅了。
您可以做的是通過實現您自己的錯誤處理程序將所有錯誤轉換為異常。ErrorException 文檔中描述了一個示例:
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
// This error code is not included in error_reporting
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");
這個例子的巧妙之處在于它考慮了您的錯誤報告設置,因此只有在您的設置下報告的錯誤才會作為異常實際拋出。否則,什么都不會發生。
測試你的代碼:
<?php
function exception_error_handler($severity, $message, $file, $line) {
if (!(error_reporting() & $severity)) {
// This error code is not included in error_reporting
return;
}
throw new ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exception_error_handler");
$_SERVER['TEST'] = new stdClass;
try {
phpinfo(INFO_VARIABLES);
} catch (\Throwable $e) {echo 'CAUGHT!!!!!!';}
打印以下輸出:
$_SERVER['TERM_SESSION_ID'] => w0t1p0:xxx-cxx-xxxxxxx-xxxxx
$_SERVER['SSH_AUTH_SOCK'] => /private/tmp/com.apple.launchd.xxxxxxxx/Listeners
$_SERVER['LC_TERMINAL_VERSION'] => 3.3.2
....
$_SERVER['argc'] => 1
$_SERVER['TEST'] =>
CAUGHT!!!!!!%
- 1 回答
- 0 關注
- 241 瀏覽
添加回答
舉報