在現代 PHP 開發中,異常處理是構建健壯應用程式的基石。PHP 5 引入了面向對象的異常機制,取代了傳統的錯誤處理方式,讓開發者能夠更優雅地管理程式流程中的錯誤狀況。
異常是指在程式執行期間發生的非預期情況,例如資料庫連線失敗、檔案讀取錯誤或輸入驗證不通過。當異常被觸發時,PHP 會保存當前代碼狀態,並將執行權移交給預定義的異常處理器。根據處理邏輯,程式可以選擇恢復執行、終止腳本或跳轉到其他代碼位置繼續運行。
核心原則:異常僅應用於真正的錯誤情況,而非作為控制流程跳轉的手段。
完整的異常處理結構包含三個關鍵字:
<?php
function checkNum($number) {
if ($number > 1) {
throw new Exception("數值必須小於或等於 1");
}
return true;
}
try {
checkNum(2);
echo "此行不會被輸出";
} catch (Exception $e) {
echo "錯誤訊息: " . $e->getMessage();
}
?>
若異常未被捕獲且未設定頂層處理器,PHP 將拋出致命錯誤:Uncaught Exception。
透過繼承內建的 Exception 類別,我們可以建立具備自定義功能的異常類別:
<?php
class CustomException extends Exception {
public function errorMessage() {
return "錯誤行號 {$this->getLine()} 在 {$this->getFile()}: {$this->getMessage()} 不是合法的 E-Mail 格式";
}
}
$email = "invalid-email";
try {
if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new CustomException($email);
}
} catch (CustomException $e) {
echo $e->errorMessage();
}
?>
一個 try 區塊可搭配多個 catch 區塊,分別處理不同類型的異常:
<?php
try {
if (filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) {
throw new CustomException($email);
}
if (strpos($email, "example") !== FALSE) {
throw new Exception("$email 包含 example 字串");
}
} catch (CustomException $e) {
echo $e->errorMessage();
} catch (Exception $e) {
echo $e->getMessage();
}
?>
在 catch 區塊中可再次拋出異常,將系統級錯誤轉換為使用者友善的訊息:
<?php
try {
try {
if (strpos($email, "example") !== FALSE) {
throw new Exception($email);
}
} catch (Exception $e) {
throw new CustomException($email);
}
} catch (CustomException $e) {
echo $e->errorMessage();
}
?>
使用 set_exception_handler() 設定全域未捕獲異常的處理函數,作為最後防線:
<?php
function globalHandler($exception) {
echo "全域異常: " . $exception->getMessage();
}
set_exception_handler('globalHandler');
throw new Exception('未被捕獲的異常');
?>
try 區塊內try 或 throw 至少對應一個 catchcatch 捕獲不同異常類型catch 區塊中可重新拋出異常總結:拋出異常,就必須捕獲它。良好的異常處理能讓應用程式在面對錯誤時保持穩定、可維護且使用者友善。