前言
最近還是常常看到同仁在處理 Exception 時,將 Exception throw 出去,但這樣前面的 StackTrace 就會斷掉了哦!
研究
許多人常常很習慣地將 ex throw 出去,如下,
1 | try |
比較好的應該只要寫 throw 就會有完整的 StackTrace 資料,如下,
1 | try |
throw new Exception
- 參數值無效
一般我們在驗證參數時,如果參數值無效時,可以用 System.ArgumentException ,而參數可以使用 nameof([參數]),如下,
1 | static void CopyObject(SampleClass original) |
如果某參數發生了 IndexOutOfRangeException,則可以將它傳入 ArgumentException 作為 InnerException 參數,如下,
1 | static int GetValueFromArray(int[] array, int index) |
- 不適當的操作,則可以使用 System.InvalidOperationException
自定的 Exception Class
我們可以繼承自 Exception ,並且可序列化,至少需要 4 個建構函式:
- 預設建構函式
- 設定 Message 的建構函式
- 同時設定 Message 和 InnerException 屬性的建構函式
- 是用來序列化例外狀況。
如下,
1 | [ ] |
詳細可以參考 建立和擲回例外狀況。
如果程式中有一堆的 try…catch ,則可以參考 包裝程式中共用的 try…catch 透過共用的 try…catch 去封裝。
實作練習
我們可以學習 JsonException Class的設計方式,來練習。
以下為Error Handling in C# with Exceptions的範例,大家可以參考一下哦!
1 | [ ] |
CalculationException 繼承自 Exception ,而 CalculationOperationNotSupportedException 繼承自 CalculationException ,因為有運算子,所以 建構函數多了一個運算子的參數 。並且覆寫 Message 的屬性,讓 Message 可讀性更高。測試程式如下,
1 | static void Main(string[] args) |
當輸入了不 support 的 運算子,output 如下,
參考資料
包裝程式中共用的 try…catch
建立和擲回例外狀況
JsonException Class
Error Handling in C# with Exceptions