利用委托机制处理.NET中的异常
生活随笔
收集整理的這篇文章主要介紹了
利用委托机制处理.NET中的异常
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
利用委托機制處理.NET中的異常<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
Terrylee,2005年12月10日
概述
在.NET中,可以輕松的通過try-catch塊來捕獲異常。為了防止在應用程序中出現未處理的異常,可以通過添加一個全局的異常處理函數,如果是多線程的處理,還必須考慮除了主線程之外的工作線程中的異常處理辦法,這里用委托機制來實現。
主線程的異常處理
使用Application對象中的ThreadException屬性設置一個delegate來捕獲所有的未處理的主線程中出現的異常。注意這個全局異常處理程序,只能捕獲到主線程中的異常,對于我們自己添加的工作線程、輔助線程的異常是捕獲不到的。
在應用程序入口添加全局異常處理:
?1/**////?<summary>
?2????????///?應用程序的主入口點。
?3????????///?</summary>
?4????????[STAThread]
?5????????static?void?Main()?
?6????????{????
?7????????????/**////添加主線程的全局異常處理
?8????????????Application.ThreadException?+=?new?
?9????????????????ThreadExceptionEventHandler(
10????????????????MainUIThreadExceptionHandler);
11
12????????????Application.Run(new?Form1());
13????????}
處理程序:
?2{
?3????MainUIThreadExceptionHandler(null,?new
?4????????ThreadExceptionEventArgs(ex));
?5}
?6
?7/**////?<summary>
?8///?主線程全局異常信息的處理
?9///?</summary>
10///?<param?name="sender"></param>
11///?<param?name="t"></param>
12public?static?void?MainUIThreadExceptionHandler(object
13????sender,?ThreadExceptionEventArgs?e)
14{
15????MessageBox.Show(
16????????"應用程序發生了如下的異常信息"
17????????+?":"?+?(char)13
18????????+?(char)13?+?e.Exception.Message
19????????+?(char)13?+?(char)13
20????????+?"請于系統管理員取得聯系!"
21????????+?(char)13?+?(char)13
22????????,?"異常信息"
23????????,?MessageBoxButtons.OK
24????????,?MessageBoxIcon.Error
25????????,?MessageBoxDefaultButton.Button1?
26????????,?MessageBoxOptions.ServiceNotification);????????
27}
工作線程的異常處理
編寫多線程代碼時,我們必須考慮在工作線程中出現的異常。在線程的入口使用try-catch塊,并通過delegate將發生的異常通知給主線程。必須將異常信息通知主線程,否則應用程序不會報錯,異常將會消失。
在線程入口使用try-catch塊:
?1/**////?<summary>
?2///?在線程的入口點加入try-catch塊
?3///?</summary>
?4private?void?DataSave()
?5{
?6????try
?7????{
?8????????CreateException();
?9????}
10????catch(Exception?e)
11????{
12????????/**////通過delegate轉向工作線程的異常處理
13????????new?WorkerThreadExceptionHandlerDelegate(
14????????????WorkerThreadExceptionHandler).BeginInvoke(e
15????????????,null
16????????????,null);
17????}
18}
工作線程異常的處理:
?1/**////?<summary>
?2///?聲明工作線程的delegate
?3///?</summary>
?4public?delegate?void
?5????WorkerThreadExceptionHandlerDelegate(Exception?e);
?6
?7/**////?<summary>
?8///?工作線程的異常處理
?9///?</summary>
10///?<param?name="e"></param>
11public?void?WorkerThreadExceptionHandler(Exception?e)
12{
13????/**////添加其他的處理代碼
14
15????///通知全局異常處理程序
16????MainUIThreadExceptionHandler(
17????????this,?new?System.Threading.
18????????ThreadExceptionEventArgs(e));
19}
總結
對于捕獲到異常,我們可以Log到文件或者數據庫,但是必須保證捕獲到所有的異常,以上通過委托機制實現了.NET中的主線程以及工作線程中的異常捕獲。
完整的程序代碼:
??1using?System;
??2using?System.Drawing;
??3using?System.Collections;
??4using?System.ComponentModel;
??5using?System.Windows.Forms;
??6using?System.Data;
??7using?System.Threading;
??8
??9namespace?UseDelegateException
?10{
?11????/**////?<summary>
?12????///?功能:利用Delegate實現異常的全局處理
?13????///?編寫:Terrylee
?14????///?日期:2005年12月10日
?15????///?</summary>
?16????public?class?Form1?:?System.Windows.Forms.Form
?17????{
?18????????private?System.Windows.Forms.Button?btnMainUIThread;
?19????????private?System.Windows.Forms.Button?btnWorkThread;
?20????????/**////?<summary>
?21????????///?必需的設計器變量。
?22????????///?</summary>
?23????????private?System.ComponentModel.Container?components?=?null;
?24
?25????????public?Form1()
?26????????{
?27????????????//
?28????????????//?Windows?窗體設計器支持所必需的
?29????????????//
?30????????????InitializeComponent();
?31
?32????????????//
?33????????????//?TODO:?在?InitializeComponent?調用后添加任何構造函數代碼
?34????????????//
?35????????}
?36
?37????????/**////?<summary>
?38????????///?清理所有正在使用的資源。
?39????????///?</summary>
?40????????protected?override?void?Dispose(?bool?disposing?)
?41????????{
?42????????????if(?disposing?)
?43????????????{
?44????????????????if?(components?!=?null)?
?45????????????????{
?46????????????????????components.Dispose();
?47????????????????}
?48????????????}
?49????????????base.Dispose(?disposing?);
?50????????}
?51
?52????????Windows?窗體設計器生成的代碼#region?Windows?窗體設計器生成的代碼
?53????????/**////?<summary>
?54????????///?設計器支持所需的方法?-?不要使用代碼編輯器修改
?55????????///?此方法的內容。
?56????????///?</summary>
?57????????private?void?InitializeComponent()
?58????????{
?59????????????this.btnMainUIThread?=?new?System.Windows.Forms.Button();
?60????????????this.btnWorkThread?=?new?System.Windows.Forms.Button();
?61????????????this.SuspendLayout();
?62????????????//?
?63????????????//?btnMainUIThread
?64????????????//?
?65????????????this.btnMainUIThread.Location?=?new?System.Drawing.Point(40,?72);
?66????????????this.btnMainUIThread.Name?=?"btnMainUIThread";
?67????????????this.btnMainUIThread.Size?=?new?System.Drawing.Size(112,?48);
?68????????????this.btnMainUIThread.TabIndex?=?0;
?69????????????this.btnMainUIThread.Text?=?"主線程異常";
?70????????????this.btnMainUIThread.Click?+=?new?System.EventHandler(this.btnMainUIThread_Click);
?71????????????//?
?72????????????//?btnWorkThread
?73????????????//?
?74????????????this.btnWorkThread.Location?=?new?System.Drawing.Point(240,?72);
?75????????????this.btnWorkThread.Name?=?"btnWorkThread";
?76????????????this.btnWorkThread.Size?=?new?System.Drawing.Size(112,?48);
?77????????????this.btnWorkThread.TabIndex?=?1;
?78????????????this.btnWorkThread.Text?=?"工作線程異常";
?79????????????this.btnWorkThread.Click?+=?new?System.EventHandler(this.btnWorkThread_Click);
?80????????????//?
?81????????????//?Form1
?82????????????//?
?83????????????this.AutoScaleBaseSize?=?new?System.Drawing.Size(6,?14);
?84????????????this.ClientSize?=?new?System.Drawing.Size(392,?197);
?85????????????this.Controls.Add(this.btnWorkThread);
?86????????????this.Controls.Add(this.btnMainUIThread);
?87????????????this.MaximizeBox?=?false;
?88????????????this.Name?=?"Form1";
?89????????????this.Text?=?"Form1";
?90????????????this.ResumeLayout(false);
?91
?92????????}
?93????????#endregion
?94
?95????????/**////?<summary>
?96????????///?應用程序的主入口點。
?97????????///?</summary>
?98????????[STAThread]
?99????????static?void?Main()?
100????????{????
101????????????/**////添加主線程的全局異常處理
102????????????Application.ThreadException?+=?new?
103????????????????ThreadExceptionEventHandler(
104????????????????MainUIThreadExceptionHandler);
105
106????????????Application.Run(new?Form1());
107????????}
108????????
109????????public?static?void?MainUIThreadExceptionHandler(Exception?ex)
110????????{
111????????????MainUIThreadExceptionHandler(null,?new
112????????????????ThreadExceptionEventArgs(ex));
113????????}
114
115????????/**////?<summary>
116????????///?主線程全局異常信息的處理
117????????///?</summary>
118????????///?<param?name="sender"></param>
119????????///?<param?name="t"></param>
120????????public?static?void?MainUIThreadExceptionHandler(object
121????????????sender,?ThreadExceptionEventArgs?e)
122????????{
123????????????MessageBox.Show(
124????????????????"應用程序發生了如下的異常信息"
125????????????????+?":"?+?(char)13
126????????????????+?(char)13?+?e.Exception.Message
127????????????????+?(char)13?+?(char)13
128????????????????+?"請于系統管理員取得聯系!"
129????????????????+?(char)13?+?(char)13
130????????????????,?"異常信息"
131????????????????,?MessageBoxButtons.OK
132????????????????,?MessageBoxIcon.Error
133????????????????,?MessageBoxDefaultButton.Button1?
134????????????????,?MessageBoxOptions.ServiceNotification);????????
135????????}
136????????
137????????/**////?<summary>
138????????///?聲明工作線程的delegate
139????????///?</summary>
140????????public?delegate?void
141????????????WorkerThreadExceptionHandlerDelegate(Exception?e);
142
143????????/**////?<summary>
144????????///?工作線程的異常處理
145????????///?</summary>
146????????///?<param?name="e"></param>
147????????public?void?WorkerThreadExceptionHandler(Exception?e)
148????????{
149????????????/**////添加其他的處理代碼
150
151????????????///通知全局異常處理程序
152????????????MainUIThreadExceptionHandler(
153????????????????this,?new?System.Threading.
154????????????????ThreadExceptionEventArgs(e));
155????????}
156????????/**////?<summary>
157????????///?制造異常信息,這里拋出一個除0的異常
158????????///?</summary>
159????????private?void?CreateException()
160????????{
161????????????int?a?=?1;
162????????????int?b?=?0;
163
164????????????int?c;
165????????????c?=?a/b;
166????????}
167????????
168????????/**////?<summary>
169????????///?在線程的入口點加入try-catch塊
170????????///?</summary>
171????????private?void?DataSave()
172????????{
173????????????try
174????????????{
175????????????????CreateException();
176????????????}
177????????????catch(Exception?e)
178????????????{
179????????????????/**////通過delegate轉向工作線程的異常處理
180????????????????new?WorkerThreadExceptionHandlerDelegate(
181????????????????????WorkerThreadExceptionHandler).BeginInvoke(e
182????????????????????,null
183????????????????????,null);
184????????????}
185????????}
186
187????????/**////?<summary>
188????????///?發生主線程異常
189????????///?</summary>
190????????///?<param?name="sender"></param>
191????????///?<param?name="e"></param>
192????????private?void?btnMainUIThread_Click(object?sender,?System.EventArgs?e)
193????????{
194????????????/**////這里出現一個異常,我們不予捕獲,交由全局處理函數
195????????????CreateException();
196????????}
197????????
198????????/**////?<summary>
199????????///?發生工作線程異常
200????????///?</summary>
201????????///?<param?name="sender"></param>
202????????///?<param?name="e"></param>
203????????private?void?btnWorkThread_Click(object?sender,?System.EventArgs?e)
204????????{
205????????????Thread?t?=?new?Thread(?new?ThreadStart(DataSave));
206????????????t.Start();
207????????}
208????}
209}
210
轉載于:https://www.cnblogs.com/Terrylee/archive/2005/12/12/295243.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的利用委托机制处理.NET中的异常的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ASP.net]TreeView(1)
- 下一篇: 听相声