在翻看之前總結的常見面試題中,關于try...catch異常處理的還是蠻多了,今天看到這個面試題,也就重新學習一下。
try-catch語句由一個try塊后跟一個或多個catch子句構成,這些子句制定不同的異常處理程序。
引發異常時,公共語言運行時(CLR)會查找處理此異常的catch語句。如果當前執行的方法不包含這樣的catch塊,則CLR會查看調用當前方法的方法,然后會遍歷疊用堆棧。如果找不到catch塊,則CLR會向用戶顯示一天有關未處理的異常的消息并停止執行程序。
try塊包含可能導致異常的保護代碼。該塊一直執行到引發異常或成功完成為止。
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塊中的語句。
try-catch-finally:不管是否有異常,finally塊中的代碼都會執行,finally塊常用于資源的釋放等。
第一種:值類型的
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的執行順序,以及引用類型和值類型,這里總結這個,只是換個角度重新學習一下。希望對你有所幫助。
新聞熱點
疑難解答