.NET中從始至終要緊記異常處理的策略:拋出具體的一個異常,而不是只拋出Exception類型的異常,這樣能方便我們捕獲對應(yīng)類型的異常。我們在編寫代碼時要注意考慮到應(yīng)用程序最差的情況;顯示有好的信息,并提供適當(dāng)?shù)墓芾韱T聯(lián)系信息。
1、不要拋出“new Exception()”
請別這樣做。Exception是一個非常抽象的異常類,捕獲這類異常通常會產(chǎn)生很多負(fù)面影響。通常情況下應(yīng)該定義我們自己的異常類,并且需要區(qū)分系統(tǒng)拋出的異常和我們自己拋出的異常。
2、不要將重要的異常信息存儲在Message屬性中
異常都封裝在類中。當(dāng)你需要返回異常信息時,請將信息存儲在一些單獨的屬性中(而不要放在Message屬性中),否則人們很難從Message屬性中解析出他們需要的信息。比如當(dāng)你僅僅需要糾正一下拼寫錯誤,如果你將錯誤信息和其它提示內(nèi)容一起以String的形式寫在了Message屬性中,那么別人該怎樣簡單地獲取他們要的錯誤信息呢?你很難想象到他們要做多少努力。
3、每個線程要包含一個try/catch塊
一般異常處理都放在了程序中一個比較集中的地方。每個線程都需要有一個try/catch塊,否則你會漏掉某些異常從而出現(xiàn)難以理解的問題。當(dāng)一個程序開啟了多個線程去處理后臺任務(wù)時,通常你會創(chuàng)建一個類型來存儲各個線程執(zhí)行的結(jié)果。這時候請不要忘記了為類型增加一個字段來存儲每個線程可能發(fā)生的異常,否則的話,主線程不會知道其他線程的異常情況。在一些“即發(fā)即忘”的場合,你可能需要將主線程中的異常處理邏輯復(fù)制一份到你的子線程中去。
4、捕獲異常后要記錄下來
不管你的程序是使用何種方式記錄日志——log4net、EIF、Event Log、TraceListeners或者文本文件等,這些都不重要。重要的是:當(dāng)你遇到異常后,應(yīng)該在某個地方將它記錄在日志中。但是請僅僅記錄一次,否則的話,你最后會得到一個非常大的日志文件,包含了許多重復(fù)信息。
5、不要只記錄Exception.Message的值,還需要記錄Exception.ToString()
當(dāng)我們談到記錄日志時,不要忘了我們應(yīng)該記錄Exception.ToString()的值,而不是Exception.Message。因為Exception.ToString()包含了“堆棧跟蹤”信息,內(nèi)部異常信息以及Message。通常這些信息非常重要,而如果你只記錄Exception.Message的話,你只可能看到類似“對象引用未指向堆中實例”這樣的提示。
6、要捕獲具體的異常
如果你要捕獲異常,請盡可能的捕獲具體異常(而非Exception)。好的代碼只能捕獲它知道該怎么處理的異常
7、不要忘記使用using
僅僅調(diào)用對象的Dispose()方法是不夠的。即使異常發(fā)生時,using關(guān)鍵字也能夠防止資源泄漏
新聞熱點
疑難解答
圖片精選