C#的異常處理機制(try...catch...finally)


what?

在 C# 語言中異常與異常處理語句包括三種形式,即 try catch、try finally、try catch finally。

在上述三種異常處理的形式中所用到關鍵字其含義如下:

  • try:一個 try 塊標識了一個將被激活的特定的異常的代碼塊。后跟一個或多個 catch 塊。

  • catch:程序通過異常處理程序捕獲異常。catch 關鍵字表示異常的捕獲。

  • finally:finally 塊用於執行給定的語句,不管異常是否被拋出都會執行。例如,如果您打開一個文件,不管是否出現異常文件都要被關閉。

  • throw:當問題出現時,程序拋出一個異常。使用 throw 關鍵字來完成。

 

why?

1.程序要健壯,必須要設計報錯機制。

2.改進:一個函數或過程,會因為不同的原因產生錯誤,報錯機制必須要把這些錯誤原因進行區分后,再匯報。

3.很多情況下,函數需要把詳細的原因,用字符串的方式返回。try-catch方式相比於返回值,更強制性要求調用者處理“出錯”的情況。

 

如何正確的使用?

  • 只針對不正常的情況才使用異常

try
{
      int i = 0;
      int[] arr = new int[5];
      while (true)
      {
        arr[i] = 0;
        i++;
       }
}
catch (IndexOutOfRangeException e)
{
      throw e;
}
 
        

     這是一個非常明顯的錯誤,希望通過異常來中斷循環而達到某種優化.其實不然.

  • CLR(Java JVM)對異常的塊中的代碼幾乎不做優化.

  • 而且創建、拋出、捕獲異常都是十分昂貴的

  • 正常的遍歷數組並不會造成冗余的邊界檢查,現代的CLR(Java JVM)會做出優化

     

  • 避免不必要的使用被檢查的異常

    “被檢查的異常”是Java語言的一個很好的特性。與返回代碼不同,"被檢查的異常"會強迫程序員處理例外的條件,大大提高了程序的可靠性。
   但是,過分使用被檢查異常會使API用起來非常不方便。如果一個方法拋出一個或多個被檢查的異常,那么調用該方法的代碼則必須在一個或多個catch語句塊中處理這些異常,或者必須通過throws聲明拋出這些異常。無論是通過catch處理,還是通過throws聲明拋出,都給程序員添加了不可忽略的負擔。
    適用於"被檢查的異常"必須同時滿足兩個條件:第一,即使正確使用API並不能阻止異常條件的發生。第二,一旦產生了異常,使用API的程序員可以采取有用的動作對程序進行處理。

 

  • 不要忽略異常

    有些程序員會寫出下面的代碼

 
        
try {...} catch (Exception e) {}

 

        或者

try {...} catch () {}

  空的catch塊會使異常達不到應有的目的,異常的目的是強迫你處理不正常的條件。忽略一個異常,就如同忽略一個火警信號一樣 -- 若把火警信號器關閉了,那么當真正的火災發生時,就沒有人看到火警信號了。所以,至少catch塊應該包含一條說明,用來解釋為什么忽略這個異常是合適的。

 

以下程序會輸出什么

 
 static void Main(string[] args){    
  try
  {
    Console.WriteLine("Hello");        
    throw new ArgumentNullException();
  }   
  catch (ArgumentNullException)
  {
    Console.WriteLine("A");
  }    
  catch (Exception)
  {
    Console.WriteLine("B");
  }
  finally
  {
    Console.WriteLine("C");
  }
  Console.ReadKey();
}

參考答案

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM