C#中try...catch的使用與常見面試題分享
前言
C#中Try-Catch語句大家都很熟悉了,但是細(xì)究起來,還是有很多東西可講的。最近在翻看之前總結(jié)的常見面試題中,發(fā)現(xiàn)關(guān)于try...catch異常處理的還是蠻多了,今天看到這個面試題,也就重新學(xué)習(xí)一下。
try..catch語法
try-catch語句由一個try塊后跟一個或多個catch子句構(gòu)成,這些子句制定不同的異常處理程序。
引發(fā)異常時,公共語言運行時(CLR)會查找處理此異常的catch語句。如果當(dāng)前執(zhí)行的方法不包含這樣的catch塊,則CLR會查看調(diào)用當(dāng)前方法的方法,然后會遍歷疊用堆棧。如果找不到catch塊,則CLR會向用戶顯示一天有關(guān)未處理的異常的消息并停止執(zhí)行程序。
try塊包含可能導(dǎo)致異常的保護代碼。該塊一直執(zhí)行到引發(fā)異?;虺晒ν瓿蔀橹?。
class Program { static void Main(string[] args) { object o = null; try { //強制轉(zhuǎn)換 null 對象的嘗試引發(fā) NullReferenceException 異常 int i = (int)o; } catch (NullReferenceException ex) //1.雖然可以使用不帶參數(shù)的 catch 子句捕捉任何類型的異常,但不推薦這種用法。 通常,您應(yīng)該只捕捉那些您知道如何從中恢復(fù)的異常。 因此,應(yīng)該總是指定一個從 System.Exception 派生的對象參數(shù)。 //2.在同一個 try-catch 語句中可以使用一個以上的特定 catch 子句。 這種情況下 catch 子句的順序很重要,因為會按順序檢查 catch 子句。 將先捕獲特定程度較高的異常,而不是特定程度較小的異常。 如果對 catch 塊進行排序以使永遠(yuǎn)不能達到后面的塊,編譯器將產(chǎn)生錯誤。 //3. int i = (int)o; 很有可能引發(fā)NullReferenceException異常,所以將此catch放在前面 //4.如果將catch (Exception ex)放在第一個,將不會達到后面的塊,編譯器將產(chǎn)生錯誤。 { Console.WriteLine(ex.Message); } catch (DivideByZeroException div) { Console.WriteLine(div.Message); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); }
try-catch的基本語法如上面所述,try-catch的執(zhí)行順序是:try塊中的代碼執(zhí)行出現(xiàn)異常將執(zhí)行catch塊中的代碼,如果try塊中的執(zhí)行沒有錯誤,將try塊中的代碼執(zhí)行完,不會執(zhí)行catch塊中的語句。
try-catch-finally:不管是否有異常,finally塊中的代碼都會執(zhí)行,finally塊常用于資源的釋放等。
try-catch的筆試題
第一種:值類型的
static int GetResult() { int a = 1; int b = 2; int n = 1; try { int k = a / b; return n; } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } finally//不管有沒有發(fā)生異常 finally都會執(zhí)行 { n++; } }
可能你已經(jīng)知道結(jié)果了:1,為什么呢?咱們可以看看反編譯的代碼,你就會清楚為什么了。
第二種:引用類型的
static Person GetResult() { int a = 1; int b = 2; Person p = new Person(); p.Age = 1; try { int k = a / b; return p; } catch (Exception ex) { Console.WriteLine(ex.Message); throw; } finally//不管有沒有發(fā)生異常 finally都會執(zhí)行 { p.Age++; } }
那么返回的這個person的age是多少呢?先看反編譯的結(jié)果:
結(jié)果為:2
總結(jié)
這個題考察還是try-catch-finally的執(zhí)行順序,以及引用類型和值類型,這里總結(jié)這個,只是換個角度重新學(xué)習(xí)一下。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
C#中的Task.Delay()和Thread.Sleep()區(qū)別(代碼案例)
Task.Delay(),async/await和CancellationTokenSource組合起來使用可以實現(xiàn)可控制的異步延遲。本文通過多種代碼案例給大家分析C#中的Task.Delay()和Thread.Sleep()知識,感興趣的朋友一起看看吧2021-06-06C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法
這篇文章主要介紹了C#判斷指定驅(qū)動器是否是Fat分區(qū)格式的方法,涉及C#中DriveFormat屬性的使用技巧,非常具有實用價值,需要的朋友可以參考下2015-04-04c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實現(xiàn)代碼
c#斐波那契數(shù)列(Fibonacci)(遞歸,非遞歸)實現(xiàn)代碼,需要的朋友可以參考一下2013-05-05automation服務(wù)器不能創(chuàng)建對象 解決方法
本文主要介紹如何解決“automation服務(wù)器不能創(chuàng)建對象”錯誤,從而解決Visual Studio.Net不能正常使用的問題,需要的朋友可以參考下。2016-06-06