在 PHP 5 中建立 Exception 物件後,雖然可以直接返回該物件,但這並非最佳實踐。更規範、更強大的做法是使用 throw 關鍵字主動拋出異常。這不僅能中斷腳本執行流程,更能將完整的異常物件(包含錯誤訊息、代碼、堆疊追蹤等)自動傳遞給呼叫端的 try-catch 區塊,實現結構化的錯誤處理。
throw 可拋出任何繼承自 Exception 類別的物件。常見用法如下:
throw new Exception("找不到指定的命令檔案", 404);
執行 throw 時,PHP 會立即中止當前函數的執行,沿著呼叫堆疊向上尋找最近的 catch 區塊。若全程未被捕獲,則觸發 Fatal Error:Uncaught Exception,並輸出完整堆疊追蹤——這正是異常機制內建的「安全閥」,避免錯誤被靜默忽略導致後續邏輯使用錯誤資料。
以下改寫自原文的 CommandManager::getCommandObject(),展示如何在多個檢查點拋出異常:
<?php
// PHP 5
require_once('cmd_php5/Command.php');
class CommandManager {
private $cmdDir = "cmd_php5";
function getCommandObject($cmd) {
$path = "{$this->cmdDir}/{$cmd}.php";
// 1. 檔案存在性檢查
if (!file_exists($path)) {
throw new Exception("找不到命令檔案:$path");
}
require_once $path;
// 2. 類別存在性檢查
if (!class_exists($cmd)) {
throw new Exception("類別 $cmd 不存在");
}
// 3. 繼承關係檢查(使用 Reflection API)
$class = new ReflectionClass($cmd);
if (!$class->isSubclassOf(new ReflectionClass('Command'))) {
throw new Exception("$cmd 不是有效的 Command 子類別");
}
return new $cmd();
}
}
?>
若呼叫端未包裹 try-catch,執行 getCommandObject('xrealcommand') 將輸出類似:
Fatal error: Uncaught exception 'Exception' with message '找不到命令檔案:cmd_php5/xrealcommand.php' in /home/xyz/BasicException.php:10
Stack trace:
#0 /home/xyz/BasicException.php(26): CommandManager->getCommandObject('xrealcommand')
#1 {main}
thrown in /home/xyz/BasicException.php on line 10
這段堆疊追蹤清晰記錄了錯誤發生位置、呼叫鏈與參數,極大便利除錯。
if ($err) return $err; 散落各處。採用 throw 讓錯誤處理集中化、可讀性更高,也是現代 PHP 框架(Laravel、Symfony 等)的標準做法。
Exception,可按業務分類捕獲(如 catch (ValidationException $e))。catch 區塊中可呼叫 $e->getMessage()、$e->getCode()、$e->getTraceAsString() 等方法取得詳細資訊。Throwable 介面,Error 亦可被 catch 捕獲,錯誤處理更完整。原文參考:PHP5 的異常處理機制之使用 throw 關鍵字