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(); }
參考答案