c# 異常

来源:http://www.cnblogs.com/suntp/archive/2017/10/08/7637605.html
-Advertisement-
Play Games

基本結構 規則 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、但是如果沒有實現未處理異常的事件,並彈出的未處理提示框中點退出按鈕,則不會執行這兩個事件,很奇怪


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DataRead 和DataSet區別 dataset表示一個數據集,是數據在記憶體中的緩存。 可以包括多個表DatSet 連接資料庫時是非面向連接的。把表全部讀到Sql中的緩衝池,並斷開於資料庫的連接 datareader 連接資料庫時是面向連接的。讀表時,只能向前讀取,讀完數據後有用戶決定是否斷開 ...
  • C# 的集合類型中, 都有Synchronized靜態方法, 和SyncRoot實例方法 對於ArrayList以及Hashtable 集合類來講,當需要做到線程安全的時候,最好利用其自帶的屬性SyncRoot 來做到,儘管也可以使用其Synchronized()方法來實現,但是使用屬性會更好。 線 ...
  • XAML代碼: <local:WorkSpaceContent x:Class="SunCreate.CombatPlatform.Client.NoticeMarquee" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentati ...
  • 1. 引言 對於ASP.NET Core應用程式來說,我們要記住非常重要的一點是:其本質上是一個獨立的控制台應用,它並不是必需在IIS內部托管且並不需要IIS來啟動運行(而這正是ASP.NET Core跨平臺的基石)。ASP.NET Core應用程式擁有一個內置的 Self Hosted(自托管) ...
  • 在我們的很多框架或者項目應用中,緩存在一定程度上可以提高程式的響應速度,以及減輕伺服器的承載壓力,因此在一些地方我們都考慮引入緩存模塊,這篇隨筆介紹使用開源緩存框架CacheManager來實現數據的緩存,在微信開發框架中,我們有一些常用的處理也需要應用到緩存,因此本隨筆以微信框架為例介紹緩存的實際... ...
  • 背水一戰 Windows 10 之 控制項(控制項基類): CoreDispatcher, 依賴屬性的設置與獲取, 依賴屬性的變化回調 ...
  • namespace MyLamdba{ class Program { static void Main(string[] args) { LamDbaShow.Show(); Console.ReadKey(); } }} namespace MyLamdba{ public delegate v ...
  • Asp.net Core 由於依賴註入的廣泛使用,配置數據遷移,與Asp.net大不相同,本篇介紹一下Asp.net Core添加數據遷移的過程 添加Nuget包 首先新建一個 Model 類 User: public class User { //用戶編號(自增長主鍵) [Key] public ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...