在 PHP 開發中,錯誤處理是構建健壯應用程式的關鍵環節。缺乏完善的錯誤處理機制,程式在遇到異常情況時可能會意外終止,甚至暴露敏感資訊給使用者,造成安全風險。本文將系統介紹 PHP 的錯誤處理機制,從基礎的 die() 到自訂錯誤處理器、錯誤觸發器,再到錯誤日誌記錄,幫助開發者掌握完整的錯誤處理體系。
試想一個讀取檔案的程式,若檔案不存在且未做任何判斷,PHP 會拋出警告並繼續執行後續程式碼,導致邏輯錯誤。健壯的寫法應預先檢查條件:
<?php
if (!file_exists("aa.txt")) {
echo "檔案不存在";
exit();
} else {
$fp = fopen("aa.txt", "r");
echo "檔案開啟成功";
fclose($fp);
}
?>
die() 語句die() 相當於 exit(),常用於條件不滿足時終止腳本並輸出訊息。利用邏輯運算子的短路特性,可寫出更簡潔的程式碼:
<?php
file_exists("aa.txt") or die("檔案不存在"); // 若為真繼續執行,否則執行 die()
$fp = fopen("aa.txt", "r");
echo "檔案開啟成功";
fclose($fp);
?>
透過 set_error_handler() 註冊自訂函數,可攔截特定級別的錯誤。處理函數至少需接受兩個參數(錯誤級別、錯誤訊息),最多可接受五個參數(含檔案、行號、錯誤上下文):
error_function(error_level, error_message, error_file, error_line, error_context);

<?php
function my_error($errno, $errmes) {
echo "<font size='5' color='red'>$errno</font><br />";
echo "錯誤訊息是:$errmes";
exit();
}
set_error_handler("my_error", E_WARNING); // 指定 WARNING 級別調用自訂函數
$fp = fopen("bb.txt", "r"); // 檔案不存在時會觸發 E_WARNING
?>
trigger_error():處理邏輯錯誤當業務邏輯出現異常(如年齡超過合理範圍)時,可主動觸發使用者定義錯誤:
<?php
function my_error3($errno, $errmes) {
echo "錯誤號是:" . $errno;
}
set_error_handler("my_error3", E_USER_WARNING);
$age = 300;
if ($age > 120) {
trigger_error("輸入的年齡過大", E_USER_WARNING); // 觸發自訂錯誤
}
echo "OK";
?>
生產環境應關閉錯誤顯示,改為記錄日誌。透過 error_log() 可將錯誤資訊寫入指定檔案:
bool error_log(string $message [, int $message_type = 0 [, string $destination [, string $extra_headers]]])
<?php
function my_error3($errno, $errmes) {
$err_info = "錯誤號是:" . $errno . "--" . $errmes;
date_default_timezone_set("PRC"); // 設定中國時區
error_log("時間是" . date("Y-m-d G-i-s") . $err_info . "\r\n", 3, "myerr.txt");
}
set_error_handler("my_error3", E_USER_WARNING);
$age = 300;
if ($age > 120) {
trigger_error("輸入的年齡過大", E_USER_WARNING);
}
echo "OK";
?>
<?php
echo time() . "<br />";
date_default_timezone_set("PRC"); // 設定為中國時區
echo date("Y-m-d G-i-s");
?>
透過完善的錯誤處理機制,不僅能提升程式穩定性,更能在問題發生時快速定位根因,是 PHP 開發者必備的核心技能。