自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C#自定義異常處理及寫入日志

開發(fā) 后端
本文將介紹C#自定義異常處理及寫入日志,System.ApplicationException 類是第三方定義的異常類,如果我們要自定義異常類,那么就應(yīng)派生于它。

我們要站在異常一定可能會發(fā)生的角度來編寫C#自定義異常處理程序,應(yīng)對程序有可能發(fā)生的錯誤建立一個良好的C#自定義異常處理策略。

在做C#自定義異常處理的時候,最好能在應(yīng)用程序所有的入口處(事件處理函數(shù),主函數(shù),線程入口)使用try-catch。但是不要在程序構(gòu)造函數(shù)入口處添加try-catch,因為此處產(chǎn)生異常,它自己并沒有能力來處理,因為它還沒有構(gòu)造完畢,只能再向外層拋出異常。

但我們也不能盲目使用異常。而且使用異常,可能會在一定程度上影響到程序的性能(C#中使用異常一般不影響性能)。

  1. //自定義異常類  
  2. publicclassMyException:ApplicationException  
  3. {  
  4. publicMyException(stringmessage):base(message)  
  5. {  
  6. }  
  7.  
  8. publicMyException(stringmessage,ExceptioninnerException)  
  9. :base(message,innerException)  
  10. {  
  11. }  

全局異常處理、多線程中的異常處理
將全局異常處理函數(shù)的委托加入到Application.ThreadException中,實現(xiàn)全局異常處理,但它只能處理主線程中未捕獲的異常。在多線程異常處理時,工作線程/輔線程中產(chǎn)生異常,可以把它轉(zhuǎn)給主線程來完成異常處理。如果線程之間不通知,是無法直接捕捉異常的。若沒有去處理工作線程/輔線程中產(chǎn)生的異常,該異常將會“消失”掉。

為什么要把異常處理都交給主線程去做呢?舉個例子:在WinForm里我們使用多線程來處理界面元素,一旦有異常發(fā)生就將異常消息顯示出來。那么,是直接在異常發(fā)生后就MessageBox,還是將消息交給MainUI來統(tǒng)一顯示?試想一下,程序要是復(fù)雜點或是有多個界面采用多線程來顯示界面元素,那么采用前者,我們就算知道了異常的詳細(xì)信息,但可能還是很難找到究竟是哪里出了問題。而通過MainUI來顯示,情況就要好很多了,尤其是還設(shè)計到其他東西的時候(如:多語言環(huán)境)。當(dāng)然,這個例子只是很小的一個方面。下面就來看怎么來實現(xiàn):

  1. usingSystem;  
  2. usingSystem.Drawing;  
  3. usingSystem.Collections;  
  4. usingSystem.ComponentModel;  
  5. usingSystem.Windows.Forms;  
  6. usingSystem.Data;  
  7. usingSystem.Threading;  
  8.  
  9. namespaceThreadApp  
  10. {  
  11. publicclassfrmMain:System.Windows.Forms.Form  
  12. {  
  13. privateSystem.Windows.Forms.ButtonbtRun;  
  14. /**////  
  15. ///必需的設(shè)計器變量。  
  16. ///  
  17. privateSystem.ComponentModel.Containercomponents=null;  
  18.  
  19. publicdelegatevoidWorkerThreadExceptionHandlerDelegate(Exceptione);  
  20. voidWorkerThreadExceptionHandler(Exceptione)  
  21. {  
  22. this.Text="Disposed.";  
  23. MainUIThreadExceptionHandler(this,newSystem.Threading.ThreadExceptionEventArgs(e));  
  24. }  
  25.  
  26. publicfrmMain()  
  27. {  
  28. InitializeComponent();  
  29. }  
  30.  
  31. /**////  
  32. ///清理所有正在使用的資源。  
  33. ///  
  34. protectedoverridevoidDispose(booldisposing)  
  35. {  
  36. if(disposing)  
  37. {  
  38. if(components!=null)  
  39. {  
  40. components.Dispose();  
  41. }  
  42. }  
  43. base.Dispose(disposing);  
  44. }  
  45.  
  46. Windows窗體設(shè)計器生成的代碼#regionWindows窗體設(shè)計器生成的代碼  
  47. /**////  
  48. ///設(shè)計器支持所需的方法-不要使用代碼編輯器修改  
  49. ///此方法的內(nèi)容。  
  50. ///  
  51. privatevoidInitializeComponent()  
  52. {  
  53. this.btRun=newSystem.Windows.Forms.Button();  
  54. this.SuspendLayout();  
  55. //  
  56. //btRun  
  57. //  
  58. this.btRun.Location=newSystem.Drawing.Point(72,24);  
  59. this.btRun.Name="btRun";  
  60. this.btRun.TabIndex=0;  
  61. this.btRun.Text="Run";  
  62. this.btRun.Click+=newSystem.EventHandler(this.btRun_Click);  
  63. //  
  64. //frmMain  
  65. //  
  66. this.AutoScaleBaseSize=newSystem.Drawing.Size(6,14);  
  67. this.ClientSize=newSystem.Drawing.Size(224,69);  
  68. this.Controls.Add(this.btRun);  
  69. this.Name="frmMain";  
  70. this.Text="ThreadApp";  
  71. this.ResumeLayout(false);  
  72.  
  73. }  
  74. #endregion  
  75.  
  76. /**////  
  77. ///應(yīng)用程序的主入口點。  
  78. ///  
  79. [STAThread]  
  80. staticvoidMain()  
  81. {  
  82. Application.ThreadException+=newThreadExceptionEventHandler(MainUIThreadExceptionHandler);  
  83. Application.Run(newfrmMain());  
  84. }  
  85.  
  86. publicstaticvoidMainUIThreadExceptionHandler(Exceptione)  
  87. {  
  88. MainUIThreadExceptionHandler(null,newSystem.Threading.ThreadExceptionEventArgs(e));  
  89. }  
  90.  
  91. publicstaticvoidMainUIThreadExceptionHandler(objectsender,ThreadExceptionEventArgst)  
  92. {  
  93. MessageBox.Show(t.Exception.Message,"Exception",  
  94. MessageBoxButtons.OK,  
  95. MessageBoxIcon.Warning);  
  96. }  
  97.  
  98.  
  99. privatevoidThrowException()  
  100. {  
  101. thrownewNotImplementedException();  
  102. }  
  103.  
  104. privatevoidRun()  
  105. {  
  106. try 
  107. {  
  108. this.Text="Waiting";//[錯誤]這里在2.0里是編譯不通過的。因為它已經(jīng)違背了我們的原則——不要跨線程操作(當(dāng)前線程對界面線程的元素進(jìn)行了操所)  
  109. Thread.Sleep(2000);  
  110. this.Text="ThrowException";  
  111. ThrowException();  
  112. this.Text="Finished";//[錯誤](同上)  
  113. }  
  114. catch(Exceptione)  
  115. {  
  116.  
  117. //如果涉及到多線程的互操作時,  
  118. //可以運用BeginInvoke方法來實現(xiàn)多線程間的互訪問。  
  119. this.BeginInvoke(  
  120. newWorkerThreadExceptionHandlerDelegate(  
  121. WorkerThreadExceptionHandler),  
  122. newobject[]{e});}  
  123. }  
  124.  
  125. privatevoidbtRun_Click(objectsender,System.EventArgse)  
  126. {  
  127. ThreadStartts=newThreadStart(Run);  
  128. Threadt=newThread(ts);  
  129. t.Start();  
  130.  
  131. //thrownewNotSupportedException();  
  132. }  
  133. }  

【編輯推薦】

  1. 強(qiáng)類型和Actor:ActorLite的演示
  2. C#的Tag Message回顧:繁瑣而危險
  3. Erlang的Actor回顧:將消息轉(zhuǎn)化為邏輯執(zhí)行
  4. Actor模型的本質(zhì):究竟是要解決什么問題
  5. 順暢的使用C# Actor:另一個解決方案
責(zé)任編輯:彭凡 來源: cnblogs
相關(guān)推薦

2021-06-17 06:52:37

C#自定義異常

2024-08-02 10:21:32

C#Exception類自定義異常

2009-08-04 13:53:58

C#委托類C#事件

2009-08-04 09:56:46

C#事件處理自定義事件

2009-08-03 16:37:49

C#異常類

2009-08-04 08:58:01

C#自定義特性

2025-01-10 09:28:25

2009-09-03 15:46:57

C#自定義事件

2010-12-24 15:38:53

C#單例模式

2009-08-28 17:45:19

C#自定義數(shù)據(jù)

2009-08-03 13:34:06

自定義C#控件

2009-08-03 13:39:46

C#自定義用戶控件

2009-08-04 12:56:51

C#自定義事件

2009-08-05 17:03:37

C#自定義控件

2011-12-16 14:23:51

Java

2009-08-04 12:40:34

c#自定義事件

2009-08-12 14:53:50

C#類型轉(zhuǎn)換函數(shù)

2024-09-11 14:46:48

C#旋轉(zhuǎn)按鈕

2009-08-04 13:31:35

C#自定義事件

2009-08-04 09:09:51

C#反射
點贊
收藏

51CTO技術(shù)棧公眾號