C#中try...catch的使用與常見(jiàn)面試題分享
前言
C#中Try-Catch語(yǔ)句大家都很熟悉了,但是細(xì)究起來(lái),還是有很多東西可講的。最近在翻看之前總結(jié)的常見(jiàn)面試題中,發(fā)現(xiàn)關(guān)于try...catch異常處理的還是蠻多了,今天看到這個(gè)面試題,也就重新學(xué)習(xí)一下。
try..catch語(yǔ)法
try-catch語(yǔ)句由一個(gè)try塊后跟一個(gè)或多個(gè)catch子句構(gòu)成,這些子句制定不同的異常處理程序。
引發(fā)異常時(shí),公共語(yǔ)言運(yùn)行時(shí)(CLR)會(huì)查找處理此異常的catch語(yǔ)句。如果當(dāng)前執(zhí)行的方法不包含這樣的catch塊,則CLR會(huì)查看調(diào)用當(dāng)前方法的方法,然后會(huì)遍歷疊用堆棧。如果找不到catch塊,則CLR會(huì)向用戶(hù)顯示一天有關(guān)未處理的異常的消息并停止執(zhí)行程序。
try塊包含可能導(dǎo)致異常的保護(hù)代碼。該塊一直執(zhí)行到引發(fā)異常或成功完成為止。
class Program { static void Main(string[] args) { object o = null; try { //強(qiáng)制轉(zhuǎn)換 null 對(duì)象的嘗試引發(fā) NullReferenceException 異常 int i = (int)o; } catch (NullReferenceException ex) //1.雖然可以使用不帶參數(shù)的 catch 子句捕捉任何類(lèi)型的異常,但不推薦這種用法。 通常,您應(yīng)該只捕捉那些您知道如何從中恢復(fù)的異常。 因此,應(yīng)該總是指定一個(gè)從 System.Exception 派生的對(duì)象參數(shù)。 //2.在同一個(gè) try-catch 語(yǔ)句中可以使用一個(gè)以上的特定 catch 子句。 這種情況下 catch 子句的順序很重要,因?yàn)闀?huì)按順序檢查 catch 子句。 將先捕獲特定程度較高的異常,而不是特定程度較小的異常。 如果對(duì) catch 塊進(jìn)行排序以使永遠(yuǎn)不能達(dá)到后面的塊,編譯器將產(chǎn)生錯(cuò)誤。 //3. int i = (int)o; 很有可能引發(fā)NullReferenceException異常,所以將此catch放在前面 //4.如果將catch (Exception ex)放在第一個(gè),將不會(huì)達(dá)到后面的塊,編譯器將產(chǎn)生錯(cuò)誤。 { Console.WriteLine(ex.Message); } catch (DivideByZeroException div) { Console.WriteLine(div.Message); } catch (Exception ex) { Console.WriteLine(ex.Message); } Console.Read(); }
try-catch的基本語(yǔ)法如上面所述,try-catch的執(zhí)行順序是:try塊中的代碼執(zhí)行出現(xiàn)異常將執(zhí)行catch塊中的代碼,如果try塊中的執(zhí)行沒(méi)有錯(cuò)誤,將try塊中的代碼執(zhí)行完,不會(huì)執(zhí)行catch塊中的語(yǔ)句。
try-catch-finally:不管是否有異常,finally塊中的代碼都會(huì)執(zhí)行,finally塊常用于資源的釋放等。
try-catch的筆試題
第一種:值類(lèi)型的
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//不管有沒(méi)有發(fā)生異常 finally都會(huì)執(zhí)行 { n++; } }
可能你已經(jīng)知道結(jié)果了:1,為什么呢?咱們可以看看反編譯的代碼,你就會(huì)清楚為什么了。
第二種:引用類(lèi)型的
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//不管有沒(méi)有發(fā)生異常 finally都會(huì)執(zhí)行 { p.Age++; } }
那么返回的這個(gè)person的age是多少呢?先看反編譯的結(jié)果:
結(jié)果為:2
總結(jié)
這個(gè)題考察還是try-catch-finally的執(zhí)行順序,以及引用類(lèi)型和值類(lèi)型,這里總結(jié)這個(gè),只是換個(gè)角度重新學(xué)習(xí)一下。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)我們的支持。
上一篇:C#執(zhí)行存儲(chǔ)過(guò)程并將結(jié)果填充到GridView的方法
欄 目:C#教程
本文標(biāo)題:C#中try...catch的使用與常見(jiàn)面試題分享
本文地址:http://mengdiqiu.com.cn/a1/C_jiaocheng/5865.html
您可能感興趣的文章
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并打開(kāi)的方法
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#停止線(xiàn)程的方法
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新聞效果的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已安裝軟件變化的方法
- 01-10C#實(shí)現(xiàn)多線(xiàn)程下載文件的方法


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹(shù)的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻 器左下角滾動(dòng)新
- 01-10C#停止線(xiàn)程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫(xiě)Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 01-10delphi制作wav文件的方法
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫(xiě)NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置