[c#基礎]關於try...catch最多見的筆試題

引言

在翻看以前總結的常見面試題中,關於try...catch異常處理的仍是蠻多了,今天看到這個面試題,也就從新學習一下。面試

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塊經常使用於資源的釋放等。對象

try-catch的筆試題

第一種:值類型的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的執行順序,以及引用類型和值類型,這裏總結這個,只是換個角度從新學習一下。但願對你有所幫助。

相關文章
相關標籤/搜索