萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP MVC 框架錯誤捕獲實戰:register_shutdown_function 與 set_error_handler

優雅的錯誤處理是專業框架的標配。PHP 提供兩大核心機制捕獲不同類型錯誤:set_error_handler 處理可捕獲錯誤(Warning、Notice 等),register_shutdown_function 捕獲致命錯誤(Fatal Error)並統一輸出。

兩大處理器對比

特性set_error_handlerregister_shutdown_function
觸發時機運行時發生錯誤(非致命)腳本關閉時(正常結束或 Fatal Error)
調用次數每次錯誤觸發每請求僅一次
可捕獲類型E_WARNING, E_NOTICE, E_DEPRECATED 等E_ERROR, E_PARSE, E_CORE_ERROR 等致命錯誤
獲取錯誤信息回調參數直接提供需用 error_get_last() 獲取最後錯誤

實現骨架

<?php
// 1. 註冊關閉處理器(捕獲 Fatal Error)
register_shutdown_function(function () {
    $error = error_get_last();
    if ($error && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) {
        // 記錄日誌、渲染友好錯誤頁
        log_error($error);
        render_error_page($error);
    }
});

// 2. 註冊錯誤處理器(捕獲 Warning/Notice)
set_error_handler(function ($severity, $message, $file, $line) {
    if (!(error_reporting() & $severity)) return false; // 尊重 error_reporting 級別
    // 開發環境顯示詳情,生產環境記錄日誌
    if (DEBUG_MODE) {
        throw new ErrorException($message, 0, $severity, $file, $line);
    }
    log_error(compact('severity', 'message', 'file', 'line'));
    return true; // 阻止 PHP 內置處理器
});

異常與錯誤統一

PHP 7+ 將多數錯誤轉為 Error 異常(繼承 Throwable),可統一用 set_exception_handler 捕獲:

set_exception_handler(function (Throwable $e) {
    log_error(['message' => $e->getMessage(), 'trace' => $e->getTraceAsString()]);
    render_error_page($e);
});

最佳實踐清單

  • 區分環境:開發環境顯示堆疊追蹤,生產環境記錄日誌並顯示通用錯誤頁。
  • 日誌格式化:結構化記錄(JSON/Monolog),便於 ELK 分析。
  • 不暴露敏感信息:生產環境錯誤頁不輸出 SQL、路徑、配置等細節。
  • 自定義異常體系:HttpException(404/403/500)、ValidationException、BusinessException 等,便於差異化處理。

結語

錯誤捕獲不是「防止報錯」,而是「可控地面對錯誤」。掌握兩大處理器分工、善用 Throwable 統一異常體系,能構建健壯、可觀測的 PHP 應用。

copyright © 萬盛學電腦網 all rights reserved