异常处理之ThreadException、unhandledException及多线程异常处理

  • 时间:
  • 浏览:2
  • 来源:大发快三代理—大发大发彩票app

未捕获的异常,通常很多我运行时期的BUG,于是我们都都 可不才能 在UnhandledException 的注册事件法律法律依据CurrentDomain_UnhandledException中将未捕获异常的信息记录在日志中。值得注意的是,UnhandledException提供的机制暂且能阻止应用系统程序终止,也很多我说,CurrentDomain_UnhandledException法律法律依据执行后,应用系统程序就会被终止。

 除了Windows窗体系统程序,再来说一下WPF系统程序。WPFUI系统程序和WindowsUI系统程序一阵一阵不一样。WPFUI系统程序是交给有有4个多叫做调度器的类:Dispatcher。代码如下:   

异常出理 之ThreadException、unhandledException及多系统程序异常出理

无论是Windows窗体系统程序还是WPF系统程序,我们都都 都都看捕获的异常当中分为"窗体系统程序异常"和"非窗体系统程序异常"。如在Windows窗体系统程序中,可能在窗体系统程序中,       

微信扫一扫,关注最课程(www.zuikc.com),获取更多我的文章,获取软件开发每日一练

WPF窗体系统程序中,让我采用如下的法律法律依据将工作系统程序的异常传递到主系统程序:  

 应用系统程序暂且会在这里捕获系统程序t中的异常,很多我会直接退出。从.NET2.0开始,任何系统程序上未出理 的异常,都会原应应用系统程序的退出(先会触发AppDomain的UnhandledException)。上边代码中的try-catch实际上捕获的还是当前系统程序的异常,而t是属于新起的异常,很多,正确的做法应该是:  

WPF窗体系统程序的出理 法律法律依据与Windows窗体系统程序比较,有有有4个多很有意思的地方:

try

{

Thread t
=new Thread((ThreadStart)delegate

{

thrownew Exception("多系统程序异常");

});

t.Start();

}

catch (Exception error)

{

MessageBox.Show(error.Message
+ Environment.NewLine + error.StackTrace);

}

thrownew Exception("窗体系统程序异常");

第有有4个多是,在Windows窗体中,我们都都 采用的是BeginInvoke法律法律依据。让我发现使用Invoke法律法律依据,暂且能引发主系统程序的Application.ThreadException。而在WPF窗体系统程序中,无论是调度器的Invoke还是BeginInvoke法律法律依据都能将异常传递给主系统程序。

在Windows窗体系统程序中,可不才能 使用窗体的BeginInvoke法律法律依据来将异常传递给主窗体系统程序:  

Thread t =new Thread((ThreadStart)delegate

{

thrownew Exception("非窗体系统程序异常");

});

t.Start();

可能触发ThreadException事件。  

我们都都 都知道ASP.NET的全局异常出理 法律法律依据是Global中的Application_Error法律法律依据。我很多我查过ASP.NET的Appdomain.CurrentDomain.unhandledException,结果用反射得到的结果,unhandledException所注册的事件法律法律依据根本就有这个法律法律依据。联想到ASP.NET页面,包括这个全局出理 类,就有交给aspnet_isapi.dll出理 的,而aspnet_isapi.dll就有有有4个多托管系统程序集。很多,应该理解为,ASP.NET的未捕获异常的出理 ,不同于托管异常(即CLR异常),很多我交给aspnet_isapi.dll这个非托管DLL出理 的。

Thread t =new Thread((ThreadStart)delegate

{

try

{

thrownew Exception("多系统程序异常");

}

catch (Exception error)

{

MessageBox.Show(
"工作系统程序异常:"+ error.Message + Environment.NewLine + error.StackTrace);

}

});

t.Start();

 也很多我说,新起的系统程序中异常的捕获,可不才能 将系统程序内部内部结构代码完整篇 try起来。原则上来说,每个系统程序买车人的异常应该在买车人的内部内部结构出理 完毕,不过仍旧有有有4个多法律法律依据,可不才能 将系统程序内部内部结构的异常传递到主系统程序。

Thread t =new Thread((ThreadStart)delegate

{

try

{

thrownew Exception("非窗体系统程序异常");

}

catch (Exception ex)

{

this.BeginInvoke((Action)delegate

{

throw ex;

});

}

});

t.Start();

出理 未捕获的异常是每个应用系统程序起码有的功能,C#在AppDomain提供了UnhandledException 事件来接收未捕获到的异常的通知。常见的应用如下:   

多系统程序的异常出理 ,要采用特殊的做法。以下的出理 法律法律依据会所处间题:   

三:ASP.NET异常出理

二:多系统程序异常出理

上边我们都都 举的例子来自于控制台系统程序,UnhandledException可不才能 在任何应用系统程序域中使用,在其他应用系统程序模型,如windows窗体系统程序,还所处ThreadException来出理 Windows 窗体系统程序中所所处的其未经出理 的异常。即,在windows窗体系统程序中,使用 ThreadException 事件来出理 UI 系统程序异常,使用 UnhandledException 事件来出理 非 UI 系统程序异常。ThreadException可不才能 阻止应用系统程序终止。具体使用法律法律依据如下:  

 可能触发UnhandledException事件,或者 整个应用系统程序会被终止。

一:ThreadException和unhandledException的区别

Thread t =new Thread((ThreadStart)delegate

{

try

{

thrownew Exception("非窗体系统程序异常");

}

catch (Exception ex)

{

this.Dispatcher.Invoke((Action)delegate

{

throw ex;

}
);

}

});

t.Start();

第5个地方很多我InnerException。WPF的工作系统程序异常可能抛到主系统程序,变成主系统程序异常的InnerException,而Windows窗体系统程序的工作系统程序异常,可能被吃掉,直接变为null,很多我在异常的Message信息中保存工作系统程序异常的Message。

上文的代码将最终引发主系统程序的Application.ThreadException。最终的结果看起来一阵一阵像: