类库探源——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設計通常反映出框架設計者的無力做出決定。一個方法要么成功,要么失敗,而失敗了就應該拋出異常??蚣茉O計者未能做出決定,這迫使API調用者來決定,但由于調用者并不了解API的實現細節,因此他們更難做出正確的決定
?
6.異常的拋出應該選擇最具有描述性的一個(如系統沒有該異常,考慮自定義一個異常)
如try 語句塊的功能是解析某參數,那么catch 塊就應該優先用 ArgumentException (參數異常),最后再用 Exception 來捕獲其他異常
?
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3动画之——动态的省略号
- 下一篇: javascript函数练习1