在 PHP 開發中,預設的錯誤輸出往往不夠友善,且難以整合到專案的日誌系統中。自定義錯誤處理讓開發者能完全掌控錯誤的捕獲、格式化、記錄與呈現方式,是建構健壯應用程式的關鍵技能。
透過 set_error_handler() 函式,我們可以指定一個自訂函式來接管所有非致命錯誤的處理邏輯:
set_error_handler('myErrorHandler');
處理函式會自動接收四個參數,包含錯誤的完整上下文資訊:
function myErrorHandler($errNo, $errMsg, $errFile, $errLine) {
// 格式化輸出錯誤資訊
echo "錯誤代碼: {$errNo}<br>";
echo "錯誤訊息: {$errMsg}<br>";
echo "發生檔案: {$errFile}<br>";
echo "發生行號: {$errLine}<br>";
// 實務上通常會寫入日誌檔或發送通知
// error_log("[{$errNo}] {$errMsg} in {$errFile}:{$errLine}");
}
// 觸發一個使用者定義的通知錯誤
trigger_error('這是一個測試錯誤', E_USER_NOTICE);
E_ERROR、E_PARSE、E_CORE_ERROR、E_USER_ERROR 等嚴重錯誤會導致腳本立即終止,自定義處理器無法攔截。error_reporting() 設定影響,被過濾的錯誤不會觸發處理器。在實際專案中,建議結合 Monolog 等日誌庫,依據錯誤嚴重程度分流處理:開發環境顯示詳細資訊,正式環境記錄日誌並顯示友善錯誤頁面。同時可搭配 register_shutdown_function() 捕獲致命錯誤,實現完整的錯誤監控體系。