基本結構 規則 1、try語句至少要有一個對應的catch或finally,不允許單獨一個try語句 2、如果到了調用棧頂部,仍然沒有找到匹配的catch語句,就會發生未處理異常 3、找到匹配的catch塊後,會先執行內層的所有finally語句,就是從拋出異常的try語句開始,到匹配異常的catc ...
基本結構
try { } catch(other exception) { ///用於捕捉各種具體的異常,具體的異常會在這裡對它進行馬上處理 } catch(exception) { ///這裡會捕捉到除了上面的所有異常,但一般需要重新拋出異常 } finally { ///無論上面代碼怎麼樣執行,最後都要執行該區域代碼,用於做一些清理等動作 }
規則
1、try語句至少要有一個對應的catch或finally,不允許單獨一個try語句
2、如果到了調用棧頂部,仍然沒有找到匹配的catch語句,就會發生未處理異常
3、找到匹配的catch塊後,會先執行內層的所有finally語句,就是從拋出異常的try語句開始,到匹配異常的catch語句之間的所有finally語句。但是匹配catch語句的那個finally語句要等該catch語句執行完畢之後才能執行
4、catch語句的處理方式一般有三種
1)、向上面拋出一個相同的異常
2)、向上面拋出一個不同的異常,通常可提供更豐富的異常信息
3)、處理異常,不向上拋異常。
5、catch和finally塊中的代碼應該非常短,避免又出現異常。即使在catch或finally語句中拋出了異常,clr會向上拋出這個新的異常,只不過原來try語句中的異常信息就會被這個新的異常覆蓋掉,一般會成為一個未處理的異常。
6、在catch語句向上拋異常,使用“throw”和“throw e”語句是有區別的,前者不會重置異常的起點,後者則會,將起點重置為throw語句這裡。
7、執行catch或finally塊時,clr不允許線程終止
8、在設計類庫的異常時,不要自己處理異常,要拋出異常,讓調用者自己去處理,如果在類庫內部處理,對調用者來說就不透明,也不友好
9、禁止只捕獲Exception異常而不重新拋出它,否則應用程式不知道已經出錯,還會繼續運行
Exception類中的常用信息欄位
Message:指出拋出異常原因的文字性說明
Source:指出生成異常的程式集名稱
StackTrace:包含拋出異常之前調用過的所有方法
InnerException:如果當前異常是在處理一個異常時拋出的,該屬性就指向上一個異常
AppDomain FirstChanceException
這個事件是在發生異常後clr在搜索所有catch塊之前發生的。因此,可利用這個事件監視AppDomain拋出的異常,添加日誌記錄等操作,使用原則如下
1、該事件不能處理異常,只是用於接收異常的通知
try...finally語句在某些常用的常用的操作中有省略的寫法,編譯器最後都會把這些省略寫法還原為try...finally寫法
1、lock語句,鎖在finally中釋放
2、using語句,在finally語句中調用Dispose方法
3、foreach語句,在finally語句中調用IEnumerator的Dispose方法
4、析構方法,在finally語句中調用Finalize方法
未處理的異常
類庫開發人員壓根用不著去想未處理的異常,只有應用程式的開發人員才需要關心未處理的異常,MS建議應用程式開發人員接收CLR的預設策略。也就是發生未處理異常時,windows會向事件日誌寫一條記錄,可以再控制面板-》事件查看器-》windows日誌-》應用程式中查看。
Application.ThreadException AppDomain.CurrentDomain.UnhandledException
1、前者用於捕捉ui線程的未處理異常,此時後者是捕捉不到的,並且前者也是UI線程所特有的異常,後者用於捕獲非UI線程中的為處理異常
2、在前者異常中,如果沒有實現該事件,則會彈出下列的界面,此時無論是點“繼續”還是“退出”按鈕,都不會向事件日誌中寫記錄,點擊繼續按鈕,程式繼續,點擊“退出”立即退出進程,不會也不會執行Application的ThreadExit和ApplicationExit事件
3、如果實現前者事件,並不拋出新的異常,則異常到此為止,windows也不會向事件日誌中寫記錄
4、如果實現前者事件,併在實現程式中在再次拋出該異常,則會彈出下麵的提示框,並且windows會向事件日誌中寫記錄,同時也會執行Application的ThreadExit和ApplicationExit事件
Application.ApplicationExit Application.ThreadExit異常處理的關係
1、如果是正常結束程式,或者用任務管理器強制關閉程式都會觸發這兩個事件
2、但是如果沒有實現未處理異常的事件,並彈出的未處理提示框中點退出按鈕,則不會執行這兩個事件,很奇怪