日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

类库探源——System.Exception

發布時間:2025/7/25 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 类库探源——System.Exception 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、MSDN描述

Exception 類: 表示在應用程序執行期間發生的錯誤

命名空間 : System

程序集: ? mscorlib.dll

繼承關系:?


常用屬性(含字段)和方法:

1. 屬性
Message ? ? ? ??描述當前異常的消息
StackTrace ? ??獲取調用堆棧上直接幀的字符串表示形式(說白了就是導致異常的函數調用棧信息)
Source ? ? ? ? ? 獲取導致異常的應用程序或對象名稱
TargetSite ? ? ?獲取引發異常的方法

其中 StackTrace 屬性最有用

2.方法

ToString ? ? ? ?返回當前異常的字符串表示形式(重寫Object.ToString())

?

備注:

1. ?Exception 的常見用法?try-catch 塊(用try包裹待執行的代碼,用catch來捕捉待執行代碼出現的異常)

2. ?try-catch-finally 塊,即使異常發生 finally 也會進,finally中放清理資源的代碼

3. ?using語句會自動生成try-finally 的IL

?

二、一些建議

1.不要返回錯誤碼(用返回錯誤碼表示異常是Win32時期的特色,在.NET時代這是不允許的)

2.要通過拋出異常的方式來報告失敗

3.不要輕易吃掉異常,如果是異常就應該拋出

4.不要把異常作為業務邏輯分支?

try {邏輯A } catch {邏輯B }后續邏輯

?

5. 不要讓公有成員根據某個選項來決定是否拋出異常

public Type GetType(string name,bool throwOnError); // 不好的設計

像上面的API設計通常反映出框架設計者的無力做出決定。一個方法要么成功,要么失敗,而失敗了就應該拋出異常。框架設計者未能做出決定,這迫使API調用者來決定,但由于調用者并不了解API的實現細節,因此他們更難做出正確的決定

?

6.異常的拋出應該選擇最具有描述性的一個(如系統沒有該異常,考慮自定義一個異常)

如try 語句塊的功能是解析某參數,那么catch 塊就應該優先用 ArgumentException (參數異常),最后再用 Exception 來捕獲其他異常

try{} catch(ArgumentException ex){} catch(Exception ex){}

?

7. 用 Try-Parse 模式

如 DateTime.TryParse 這是綜合了性能和異常處理的好東西,比直接 DateTime.Parse 好

?

三、使用log4net記錄異常信息

官網:http://logging.apache.org/log4net/

1. 配置 log4net.config

<?xml version="1.0" encoding="utf-8"?> <log4net><root><level value="ALL" /><appender-ref ref="Text" /></root><appender name="Text" type="log4net.Appender.RollingFileAppender"><param name="File" value="D:\log4netDemo\log4netDemoApp.log" /><param name="AppendToFile" value="true" /><param name="MaxSizeRollBackups" value="1000" /><param name="MaximumFileSize" value="1024KB" /><param name="RollingStyle" value="Size" /><param name="StaticLogFileName" value="true" /><layout type="log4net.Layout.PatternLayout"><param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" /></layout></appender> </log4net>

修改上面的?<param name="File" value="D:\log4netDemo\log4netDemoApp.log" /> 改為你想要的日志存放路徑

注意這個 log4net.config 應該編譯輸入到程序目錄(如:bin\Debug)?

2. 在主程序啟動類中寫如下代碼

private const string c_logConfig = "log4net.config";private log4net.ILog _log = log4net.LogManager.GetLogger(typeof(Program));static void Main(string[] args) {using (Stream stream = File.OpenRead(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, c_logConfig))){XmlConfigurator.Configure(stream);} 。。。}

3. 使用

_log.Info("Start"); _log.Error("捕捉到異常{0}", ex);

更多log4net方法,查看API文檔

?

四、全局異常捕獲

AppDomain.CurrentDomain.UnhandledException

static void Mian() {AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) {Exception error = (Exception)e.ExceptionObject;_log.Error("MyHandler caught : " + error.Message); }

WinForm、WPF、ASP.NET 均有全局異常捕獲

?

五、多線程中的異常捕獲

錯誤的捕獲方式:

1 static void ThreadException1() 2 { 3 var t = new Thread(() => { throw new Exception("線程拋出異常"); }); 4 try 5 { 6 t.Start(); 7 } 8 catch (Exception ex) 9 { 10 // 這樣捕獲不到線程異常 11 _log.Error("捕獲到線程異常 {0}", ex); 12 } 13 } View Code

正確的捕獲方式:

1 static void ThreadException2() 2 { 3 var t = new Thread(() => 4 { 5 try 6 { 7 throw new Exception("線程拋出異常"); 8 } 9 catch (Exception ex) 10 { 11 _log.Error("捕獲到線程異常 {0}", ex); 12 } 13 }); 14 t.Start(); 15 } View Code

?

六、系統事件查看器

這是一個很有用的功能,估計還有不少同學不知道

右鍵計算機(我的電腦) ==> 管理 ==> 計算機管理

?

?

?

本文代碼下載

?

轉載于:https://www.cnblogs.com/Aphasia/p/4155382.html

總結

以上是生活随笔為你收集整理的类库探源——System.Exception的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。