介紹
在任何應用系統開發中異常管理對開發人員來說都是一個關鍵領域作為一個開發人員你應該采用一種合適的能讓你編寫健壯且高質量代碼的異常管理策略如果使用得當異常管理將是一個很強大的概念而且使你的開發工作變的很容易然而一個不合適的異常處理將會使你的應用系統性能降低
在你鑽研這些之前要先搞清楚異常管理是什麼這點很重要一般來說異常就表示打破系統預定的假設異常和錯誤是不一樣的為了解釋清楚我們來看兩個例子
示例一
我們假設你試圖向一個文件寫入數據而你的應用程序也認為這個文件在正確的路徑上如果不在就會拋出一個異常而話說回來如果你的職責是跟蹤此文件那麼代碼裡還有(找不到文件的)異常那將是一個不好的編碼習慣這種情況應該被校驗代碼處理(而不是異常)
示例二
再讓我們假設一個一般的ASPNET程序中你正試圖更新數據庫中所有必需的字段你的應用程序認為此數據庫連接可用假設實際上這個連接是不可用的……拋出異常是一個解決方案而我們又把話說回來如果更新數據庫的必填字段時出現有幾個值為空的字段那拋出異常就沒有必要了這些處理應該由校驗代碼完成
如何處理異常
作為一個開發人員你應該感受到通過try catch finally塊來構建一個結構化異常處理機制的優點NET框架提供了一大堆異常處理層次來處理不同種類的異常所有的異常都繼承自Exception(基類)你可以通過繼承來實現自定義錯誤處理以擴展異常處理機制不幸的是很多開發人員都誤用了這種架構能力一個隨時要記著的事是當一個異常發生在運行時時(這個架構)應該如何運作?一般有以下三種情況
忽略異常讓它在調用棧裡上升而被其它的catch塊捕獲
捕獲異常同時為你的應用程序執行必要的動作如果你不想再次在異常中拋出異常的話
捕獲異常並用其它異常覆蓋它這樣和你的應用程序有更密切的關系異常覆蓋是為了避免打破(架構中的)抽象層次你可以通過你拋出的異常的InnerException屬性指定原異常是什麼這樣就可以把你現有的異常用一個新的異常來覆蓋了(更與你系統有關的)為了了解異常覆蓋讓我們來看一個能引起IOException異常的方法你可以在應用級別使用LoadingException 或 FailtoLoadInfoException來覆蓋原有的IOException異常這樣比把底層的IOException給用戶看到要來的好些
一個應用程序的異常處理框架應該有以下幾種(要求)
探測異常
執行代碼清除
內部異常覆蓋
內部異常替換
記錄並報告錯誤信息
建立能被外部監視的事件以幫助系統操作
在開始你應該建立一個一致的健壯的異常管理架構在你所有的系統中應該很好的封裝並抽象其記錄和報告等的細節
好的習慣
以下列出一些不錯的提示/建議供你在(設計)異常處理(時)參考
拋出異常要不小的代價所以你應該盡可能地在異常情況下進行異常處理不要去控制正規邏輯流程比如以下代碼
void EmpExits(string EmpId)
{
// search for employee
if(dr
Read(EmpId) ==
) // no record found
{
throw(new Exception(
Emp Not found
));
}
}
應該用以下代碼
bool EmpExits(string EmpId)
{
// search for employee
if(dr
Read(EmpId) ==
) // no record found
{
return false;
}
}
避免在循環中捕獲異常如果實在是要捕獲那把整個循環都放在try/catch塊裡
采用標准try/catch/finally異常處理方式進行處理這在托管代碼裡是被推薦的最後的Finally塊確保異常事件中的資源都被釋放掉了
比如
SqlConnection conn = new SqlConnection(
);
try
{
conn
Open();
// some operation
// some additional operations
}
catch(Exception ex)
{
// handle the exception
}
finally
{
if (conn != null && conn
State == ConnectionState
Open)
conn
Close(); // closing the connection
}
[] []
From:http://tw.wingwit.com/Article/program/net/201311/15371.html