WCF 以簡單易用著稱,異常處理亦然。本文介紹基礎編程模式。
將異常分為應用異常(業務邏輯)與基礎設施異常(序列化、傳輸等)。若服務操作拋出 DivideByZeroException,客戶端捕獲到的永遠是固定訊息的 FaultException:「由於內部錯誤,服務器無法處理該請求...」。原始異常資訊被屏蔽,主要為安全考量,防止敏感資訊洩露給不受信任客戶端。
開發除錯階段需獲取完整異常細節。兩種等效方式:
<serviceDebug includeExceptionDetailInFaults="true" /> 於服務行為。[ServiceBehavior(IncludeExceptionDetailInFaults=true)]。開啟後,客戶端捕獲 FaultException<ExceptionDetail>。ExceptionDetail 為資料契約,封裝 HelpLink、InnerException、Message、StackTrace、Type 等屬性,對應 System.Exception 成員。可輸出完整堆疊追蹤與異常型別。
注意:會話通道遇異常轉為 Faulted 狀態,需呼叫 Abort() 強制中止而非 Close()。IncludeExceptionDetailInFaults 僅供除錯使用,生產環境應關閉。