c#基礎語言編程-異常處理

異常的定義

異常就是程序中的運行時錯誤,當出現異常時,系統會捕獲這個錯誤並拋出一個異常。若程序沒有提供處理該異常的代碼,系統會掛起這個程序。
這裏寫圖片描述

常見異常的類型

  • System.Exception 最泛化的異常,其他所有異常類型都從它派生。
  • System.ArgumentException: 傳給方法的一個參數無效。
  • System.ArgumenNullException: 一個不應該爲null的參數爲null。
  • System.ApplicationException: 一個自定義的應用程序異常,開發者可以用它標識特殊的非致命的應用程序錯誤。
  • System.FormatException:參數格式不符合調用的方法的參數規範。
  • System.IndexOutOfRangeException:試圖訪問一個不存在的數組元素。
  • System.NotImplementdeException:雖然找到了方法簽名,但該方法尚未完全實現。
  • System.NullReferenceException:試圖訪問尚未包含任何數據的一個變量(一般是調用其值爲null的一個對象的成員是引發)。
  • System.ArithemeticException: 發生了一個無效的數學運算,但其中不包括被零除。
  • System.StackOverFlowException:通常意味着一個無限循環,方法不停地回調自身(成爲遞歸)。

異常處理過程

  • (1)BCL定義了許多類,每個類代表了一個指定的異常類型。當異常發生時,CLR首先創建給類型的異常對象,然後,尋找適當的catch子句處理異常。
  • (2)若異常在一個沒有被try語句保護的代碼中產生或若try語句沒有匹配的catch子句,系統將按順序搜索調用棧,尋找匹配的處理代碼。

異常處理語句

try
{
     //可能出現異常的代碼!!
    //try塊中的代碼,如果一旦某句代碼發生了異常,這從該條語句直接跳轉到catch 塊中,在try 塊中該條語句後續的代碼不會繼續執行了。
 }
 catch
{
//try塊中的代碼發生異常後,執行這裏的代碼
 //如果try塊中的代碼沒有發生異常,這不會執行catch 塊中的代碼
 }
 finally
 {
  //無論try塊中的代碼是否發生異常,都會執行這裏的代碼 ,比如資源釋放,因爲無論程序執行是否發生異常都需要釋放資源。
 }
static void T1()
  {
    try
    { 
   Console.WriteLine("正常1");
   //====引發異常代碼=====
 int n = 10, m = 0;
 Console.WriteLine(n / m);
  ///====引發異常代碼=====
  Console.WriteLine("正常2");
 return; 
 Console.WriteLine("正常3");
}
catch (Exception)
   {        
    Console.WriteLine("溢出1");
    //主動向上拋出異常時
    throw;
   }
finally
   {
     //雖然try塊中有return語句,但是finally中的代碼依然會執行,並且是在return 語句之前執行的。Console.WriteLine("最終1");
    }
}

當異常代碼註釋時;
輸出:正常1,正常2,最終1.
當異常代碼取消註釋時;
輸出:正常1,溢出1,最終1.
其中有return,但這個對finally不管用,最終還是執行。
當發生異常後,就從異常代碼直接跳轉到catch語句中,異常代碼後的代碼不再執行,執行catch後,再執行finally語句。
程序可以使用 throw 關鍵字顯式地引發異常。也可throw new argumentexception等手動拋出異常。

常見的問題

1、什麼時候該異常處理?
1)代碼最外層,如WinFrom,避免用戶看到內部異常信息用戶體驗不好,或者造成程序崩潰,可以用log4net之類的框架記錄異常。
2)遇到異常需要恢復狀態或者重試的地方。例如連接數據庫偶然失敗了,可以有個重連機制,在Catch塊重新連接數據庫。
3)對於一系列有可能失敗的任務,其中有一個任務失敗,不想影響到其他任務。例如要上傳100張圖片,不想因爲一張圖片上傳發生異常而失敗,進而終止整個上傳任務,僅需要記錄下失敗的圖片,提醒用戶重傳即可。
2、異常處理需要注意的地方
1)Catch和Finally代碼應該非常短,而且成功率極高,避免自己又拋出一個異常。否則CLR會終止進程,避免安全漏洞或者不可預知的後果。這個類似於Windows藍屏,發生了嚴重的錯誤,寧願使系統不可用。
2)Catch塊儘量避免直接捕捉異常的基類Exception,而應該捕捉具體的異常類。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章