首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 開發者必須掌握的異常處理機制

     編輯:PHP 相關知識

為什麼要用異常?

傳統「錯誤碼 + 記錄 Log」模式弊端:

  • 錯誤處理代碼散落業務邏輯,可讀性差(if ($r === 'err1') ...)。
  • 多層函數呼叫需層層透傳錯誤碼,易遺漏、難維護。
  • 無法統一捕獲、分類、記錄、轉換錯誤。

異常機制優勢

  1. 代碼連貫:業務主流程無干擾,異常點 throw new SpecificException() 即可。
  2. 自動冒泡:未捕獲時自動向上傳遞至最近的 try-catch,跨層級零成本。
  3. 分類處理:自訂異常類別繼承 Exception,依類型 catch (DbException $e) / catch (ValidationException $e) 精準處理。
  4. 豐富上下文:$e->getMessage()、getFile()、getLine()、getTrace()、getPrevious()(異常鏈)。

實戰範例

// 定義業務異常
class InsufficientStockException extends Exception {}
class PaymentFailedException extends Exception {}

function placeOrder($userId, $items) {
    // 庫存檢查
    if (!checkStock($items)) throw new InsufficientStockException("庫存不足");
    // 支付
    if (!chargePayment($userId, $total)) throw new PaymentFailedException("支付失敗");
    // 寫入訂單
    return createOrder($userId, $items);
}

// 控制器統一捕獲
try {
    $order = placeOrder($uid, $cart);
    jsonResponse(['ok'=>true, 'order'=>$order]);
} catch (InsufficientStockException $e) {
    logWarning($e);
    jsonResponse(['ok'=>false, 'code'=>'STOCK', 'msg'=>$e->getMessage()], 400);
} catch (PaymentFailedException $e) {
    logError($e);
    jsonResponse(['ok'=>false, 'code'=>'PAY', 'msg'=>$e->getMessage()], 402);
} catch (Exception $e) {
    logCritical($e); // 未預期錯誤
    jsonResponse(['ok'=>false, 'code'=>'SYS', 'msg'=>'系統錯誤'], 500);
}

最佳實踐清單

  • 只在「真正異常、不可預期、需上層決策」時拋出;正常業務分支用返回值。
  • 異常類別命名以 Exception 結尾,建立層級體系(AppException → DbException/HttpException)。
  • catch 具體類別在前,Exception 兜底在後。
  • 生產環境關閉 display_errors,統一由異常處理器記錄日誌、回傳友善錯誤頁/JSON。
  • PHP 7+ Throwable 介面統一 Exception 與 Error,catch (Throwable $e) 可捕獲所有致命錯誤。

小專案可簡化

極簡專案(單檔、無框架)仍可用錯誤碼快速交付。但凡涉及「多模組、團隊協作、長期維護」,異常機制是專業 PHP 開發者的必備基本功。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved