介紹
在任何應用系統開發中,異常管理對開發人員來說都是一個關鍵領域。作為 一個開發人員,你應該采用一種合適的、能讓你編寫健壯且高質量代碼的異常管 理策略。如果使用得當,異常管理將是一個很強大的概念而且使你的開發工作變 的很容易。然而,一個不合適的異常處理將會使你的應用系統性能降低。
在你鑽研這些之前,要先搞清楚異常管理是什麼,這點很重要。一般來說異 常就表示“打破系統預定的假設”。“異常”和“錯誤”是不一樣的,為了解釋 清楚,我們來看兩個例子:
示例一
我們假設你試圖向一個文件寫入數據,而你的應用程序也認為這個文件在正 確的路徑上。如果不在,就會拋出一個異常。而話說回來,如果你的職責是跟蹤 此文件,那麼代碼裡還有(找不到文件的)異常那將是一個不好的編碼習慣,這 種情況應該被校驗代碼處理(而不是異常)。
示例二
再讓我們假設一個一般的ASP.NET程序中,你正試圖更新數據庫中所有必需的 字段。你的應用程序認為此數據庫連接可用,假設實際上這個連接是不可用的… …拋出異常是一個解決方案。而我們又把話說回來,如果更新數據庫的必填字段 時出現有幾個值為空的字段,那拋出異常就沒有必要了,這些處理應該由校驗代 碼完成。
如何處理異常
作為一個開發人員,你應該感受到通過try, catch, finally塊來構建一個結 構化異常處理機制的優點。.NET框架提供了一大堆異常處理層次來處理不同種類 的異常。所有的異常都繼承自Exception(基類)。你可以通過繼承來實現自定 義錯誤處理以擴展異常處理機制。不幸的是,很多開發人員都誤用了這種架構能 力。一個隨時要記著的事是當一個異常發生在運行時時(這個架構)應該如何運 作?一般有以下三種情況:
忽略異常,讓它在調用棧裡上升而被其它的catch塊捕獲。
捕獲異常,同時為你的應用程序執行必要的動作,如果你不想再次在異常中 拋出異常的話。
捕獲異常,並用其它異常覆蓋它。這樣和你的應用程序有更密切的關系。異 常覆蓋是為了避免打破(架構中的)抽象層次。你可以通過你拋出的異常的 InnerException屬性指定原異常是什麼,這樣就可以把你現有的異常用一個新的 異常來覆蓋了(更與你系統有關的)。為了了解異常覆蓋,讓我們來看一個能引 起IOException異常的方法,你可以在應用級別使用LoadingException 或 FailtoLoadInfoException來覆蓋原有的IOException異常,這樣比把底層的 IOException給用戶看到要來的好些。
一個應用程序的異常處理框架應該有以下幾種(要求):
探測異常;
執行代碼清除;
內部異常覆蓋;
內部異常替換;
記錄並報告錯誤信息;
建立能被外部監視的事件以幫助系統操作;
在開始你應該建立一個一致的,健壯的異常管理架構,在你所有的系統中應 該很好的封裝並抽象其記錄和報告等的細節。