如果您必須將PHP錯誤/異常返回給客戶端,這是不推薦的(但我知道,開發起來更容易),您需要PHP的自定義error/uncaught- exception處理程序。通過這種方式,您可以自定義錯誤/例外的顯示方式。
下面是一個示例代碼,將錯誤和未捕獲的異常輸出爲JSON對象。
// Set error handler
set_error_handler('api_error_handler');
function api_error_handler($errno, $errstr) {
return api_error($errstr, $errno, 500);
}
// Set uncaught exceptions handler
set_exception_handler('api_exception_handler');
function api_exception_handler($exception) {
return api_error($exception->getMessage(), $exception->getCode(), 500);
}
// Error/Exception helper
function api_error($error, $errno, $code) {
// In production, you might want to suppress all these verbose errors
// and throw a generic `500 Internal Error` error for all kinds of
// errors and exceptions.
if ($environment == 'production') {
$errno = 500;
$error = 'Internal Server Error!';
}
http_response_code($code);
header('Content-Type: application/json');
return json_encode([
'success' => false,
'errno' => $errno,
'error' => $error,
]);
}
但是這還不是全部;由於用戶定義的錯誤處理程序無法處理致命錯誤,因此仍會顯示致命錯誤消息。你需要與ini_set()
調用禁用顯示錯誤信息:
ini_set('display_errors', 0);
那麼如何處理的致命錯誤?致命錯誤可以使用register_shutdown_function()
在關機時處理。在關機處理程序中,我們需要通過調用error_get_last()
來獲取最新的錯誤信息。所以:
// Set shutdown handler
register_shutdown_function('api_fatal_error_handler');
function api_fatal_error_handler() {
$error = error_get_last();
if ($error && error_reporting() && $error['type'] === E_ERROR) {
return api_error($error['message'], E_CORE_ERROR, 500);
}
}
然後在javascript的東西方面,你必須添加一個錯誤回調並向用戶顯示錯誤信息。
畢竟,爲什麼不使用成熟的錯誤/異常處理程序包而不是實現所有這些?滿足Whoops。
代碼很好,只是方便查看解析的json中的php錯誤,以便在角度表達式中直接查看任何錯誤。與信息泄漏良好的提示。 – ItsmeJulian