成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

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

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

  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. ///必需的設計器變量。  
  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窗體設計器生成的代碼#regionWindows窗體設計器生成的代碼  
  47. /**////  
  48. ///設計器支持所需的方法-不要使用代碼編輯器修改  
  49. ///此方法的內容。  
  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. ///應用程序的主入口點。  
  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里是編譯不通過的。因為它已經違背了我們的原則——不要跨線程操作(當前線程對界面線程的元素進行了操所)  
  109. Thread.Sleep(2000);  
  110. this.Text="ThrowException";  
  111. ThrowException();  
  112. this.Text="Finished";//[錯誤](同上)  
  113. }  
  114. catch(Exceptione)  
  115. {  
  116.  
  117. //如果涉及到多線程的互操作時,  
  118. //可以運用BeginInvoke方法來實現多線程間的互訪問。  
  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. 強類型和Actor:ActorLite的演示
  2. C#的Tag Message回顧:繁瑣而危險
  3. Erlang的Actor回顧:將消息轉化為邏輯執行
  4. Actor模型的本質:究竟是要解決什么問題
  5. 順暢的使用C# Actor:另一個解決方案
責任編輯:彭凡 來源: cnblogs
相關推薦

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

2010-12-24 15:38:53

C#單例模式

2009-08-03 13:34:06

自定義C#控件

2009-08-28 17:45:19

C#自定義數據

2009-08-03 13:39:46

C#自定義用戶控件

2009-09-03 15:46:57

C#自定義事件

2009-08-04 12:40:34

c#自定義事件

2009-08-12 14:53:50

C#類型轉換函數

2024-09-11 14:46:48

C#旋轉按鈕

2009-08-04 12:56:51

C#自定義事件

2009-08-05 17:03:37

C#自定義控件

2011-12-16 14:23:51

Java

2025-02-13 00:28:26

2021-03-29 00:02:10

C#Attribute元素
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av黄色在线 | 欧美极品在线视频 | 国产免费国产 | 国产一区91精品张津瑜 | 成人精品| 99久久精品国产麻豆演员表 | 国产精品久久久久久久久久久免费看 | 亚洲日本欧美 | 99热精品在线观看 | 久久久久国产一区二区三区不卡 | av三级| 影音先锋中文字幕在线观看 | 天堂一区二区三区四区 | 蜜桃视频麻豆 | 午夜影院网站 | 精品av | 99爱视频 | 免费在线观看一区二区三区 | 亚洲国产欧美国产综合一区 | 亚洲社区在线 | 麻豆成人在线视频 | 亚洲一区二区不卡在线观看 | 欧美在线一区二区三区 | 久久成人免费 | 国产精品久久二区 | 亚洲看片| 亚洲一区二区三区高清 | 嫩草视频网站 | 国产三区视频在线观看 | 岛国av一区二区 | 日韩成人国产 | 国产精品久久久久久久久久 | 成人免费看黄网站在线观看 | 亚洲91视频 | 在线免费中文字幕 | 午夜免费视频观看 | 国产精品久久久久久久免费大片 | 日日碰狠狠躁久久躁婷婷 | 国产99久久久国产精品 | 国产九九九 | 狠狠草视频 |