在翻看以前總結的常見面試題中,關於try...catch異常處理的仍是蠻多了,今天看到這個面試題,也就從新學習一下。面試
try-catch語句由一個try塊後跟一個或多個catch子句構成,這些子句制定不一樣的異常處理程序。ide
引起異常時,公共語言運行時(CLR)會查找處理此異常的catch語句。若是當前執行的方法不包含這樣的catch塊,則CLR會查看調用當前方法的方法,而後會遍歷疊用堆棧。若是找不到catch塊,則CLR會向用戶顯示一天有關未處理的異常的消息並中止執行程序。學習
try塊包含可能致使異常的保護代碼。該塊一直執行到引起異常或成功完成爲止。spa
1 class Program 2 { 3 static void Main(string[] args) 4 { 5 object o = null; 6 try 7 { 8 //強制轉換 null 對象的嘗試引起 NullReferenceException 異常 9 int i = (int)o; 10 } 11 12 catch (NullReferenceException ex) 13 //1.雖然能夠使用不帶參數的 catch 子句捕捉任何類型的異常,但不推薦這種用法。 一般,您應該只捕捉那些您知道如何從中恢復的異常。 所以,應該老是指定一個從 System.Exception 派生的對象參數。 14 //2.在同一個 try-catch 語句中能夠使用一個以上的特定 catch 子句。 這種狀況下 catch 子句的順序很重要,由於會按順序檢查 catch 子句。 將先捕獲特定程度較高的異常,而不是特定程度較小的異常。 若是對 catch 塊進行排序以使永遠不能達到後面的塊,編譯器將產生錯誤。 15 //3. int i = (int)o; 頗有可能引起NullReferenceException異常,因此將此catch放在前面 16 //4.若是將catch (Exception ex)放在第一個,將不會達到後面的塊,編譯器將產生錯誤。 17 { 18 Console.WriteLine(ex.Message); 19 } 20 catch (DivideByZeroException div) 21 { 22 Console.WriteLine(div.Message); 23 } 24 catch (Exception ex) 25 { 26 Console.WriteLine(ex.Message); 27 } 28 Console.Read(); 29 }
try-catch的基本語法如上面所述,try-catch的執行順序是:try塊中的代碼執行出現異常將執行catch塊中的代碼,若是try塊中的執行沒有錯誤,將try塊中的代碼執行完,不會執行catch塊中的語句。code
try-catch-finally:無論是否有異常,finally塊中的代碼都會執行,finally塊經常使用於資源的釋放等。對象
第一種:值類型的blog
1 static int GetResult() 2 { 3 int a = 1; 4 int b = 2; 5 int n = 1; 6 try 7 { 8 int k = a / b; 9 return n; 10 } 11 catch (Exception ex) 12 { 13 14 Console.WriteLine(ex.Message); 15 throw; 16 } 17 finally//無論有沒有發生異常 finally都會執行 18 { 19 n++; 20 } 21 }
可能你已經知道結果了:1,爲何呢?我們能夠看看反編譯的代碼,你就會清楚爲何了。排序
第二種:引用類型的資源
1 static Person GetResult() 2 { 3 int a = 1; 4 int b = 2; 5 Person p = new Person(); 6 p.Age = 1; 7 try 8 { 9 int k = a / b; 10 return p; 11 } 12 catch (Exception ex) 13 { 14 15 Console.WriteLine(ex.Message); 16 throw; 17 } 18 finally//無論有沒有發生異常 finally都會執行 19 { 20 p.Age++; 21 } 22 }
那麼返回的這個person的age是多少呢?先看反編譯的結果:編譯器
結果爲:2
這個題考察仍是try-catch-finally的執行順序,以及引用類型和值類型,這裏總結這個,只是換個角度從新學習一下。但願對你有所幫助。