完善的錯誤處理是專業 PHP 應用的基石。本文系統介紹三層錯誤處理策略:基礎終止、自訂錯誤處理器、錯誤記錄與通知,並附上生產環境可用的代碼範例。
簡單腳本可在關鍵操作前檢查條件,失敗即終止:
<?php
if (!file_exists("welcome.txt")) {
die("File not found");
}
$file = fopen("welcome.txt", "r");
?>
缺點: 直接終止腳本,無法優雅降級、記錄日誌或釋放資源,不適合複雜應用。
function error_handler($errno, $errstr, $errfile = '', $errline = 0, $errcontext = []) {
// $errno: 錯誤等級 | $errstr: 錯誤訊息
// $errfile: 檔案 | $errline: 行號 | $errcontext: 當前變數陣列
}
| 值 | 常數 | 說明 |
|---|---|---|
| 2 | E_WARNING | 非致命執行時警告,腳本繼續 |
| 8 | E_NOTICE | 執行時通知,潛在問題 |
| 256 | E_USER_ERROR | 使用者觸發的致命錯誤 |
| 512 | E_USER_WARNING | 使用者觸發的警告 |
| 1024 | E_USER_NOTICE | 使用者觸發的通知 |
| 4096 | E_RECOVERABLE_ERROR | 可捕獲的致命錯誤 |
| 8191 | E_ALL | 所有錯誤(除 E_STRICT) |
<?php
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Ending Script";
die();
}
// 處理所有錯誤
set_error_handler("customError");
// 或僅處理特定等級
set_error_handler("customError", E_USER_WARNING | E_USER_ERROR);
?>
<?php
$test = 2;
if ($test > 1) {
trigger_error("Value must be 1 or below", E_USER_WARNING);
}
?>
輸出:Error: [512] Value must be 1 or below
error_log("Database connection failed: $errstr", 0);
<?php
function customError($errno, $errstr) {
echo "<b>Error:</b> [$errno] $errstr<br />";
echo "Webmaster has been notified";
// 類型 1: 發送 Email
error_log("Error: [$errno] $errstr", 1, "admin@example.com", "From: webmaster@example.com");
}
set_error_handler("customError", E_USER_WARNING);
$test = 2;
if ($test > 1) {
trigger_error("Value must be 1 or below", E_USER_WARNING);
}
?>
error_log("Error: [$errno] $errstr\n", 3, "/var/log/php_app_errors.log");
display_errors=On、error_reporting=E_ALL;生產環境 display_errors=Off、log_errors=Ontry-catch 與 set_exception_handler(),錯誤處理器僅處理無法拋出例外的舊式錯誤register_shutdown_function() 或 finally 區塊確保連線、鎖、暫存檔正確釋放App\Exceptions\Handler 統一處理、report() 回報、render() 渲染Kernel::terminate()、Monolog 整合log_message()、show_error()從 die() 到結構化日誌與告警體系,錯誤處理的演進反映了應用成熟度。建立統一、可觀測、可運維的錯誤處理機制,是從「能跑」到「穩定上線」的關鍵一步。