我们有一个接口IPoller,为此我们有各种实现。我们有一个进程将采取一个IPoller并在一个单独的线程中启动它。我试图想出一个通用的方法来为任何不自己执行它的IPollers提供异常处理。.NET线程抛出异常时会发生什么?
我最初的想法是创建一个IPoller的实现,它可以接受一个IPoller,并提供一些日志记录功能。我遇到的问题是如何提供这种错误处理?如果我有IPoller.Start()这是线程的目标是哪里发生异常?或者我可以挂钩的线程上有什么东西?
我们有一个接口IPoller,为此我们有各种实现。我们有一个进程将采取一个IPoller并在一个单独的线程中启动它。我试图想出一个通用的方法来为任何不自己执行它的IPollers提供异常处理。.NET线程抛出异常时会发生什么?
我最初的想法是创建一个IPoller的实现,它可以接受一个IPoller,并提供一些日志记录功能。我遇到的问题是如何提供这种错误处理?如果我有IPoller.Start()这是线程的目标是哪里发生异常?或者我可以挂钩的线程上有什么东西?
喜欢的东西:
Thread thread = new Thread(delegate() {
try
{
MyIPoller.Start();
}
catch(ThreadAbortException)
{
}
catch(Exception ex)
{
//handle
}
finally
{
}
});
这将确保异常不会使它到达线程的顶部。
您应该在线程顶部使用的方法处捕获异常,并从那里进行日志记录。
一个未处理的异常(在一个线程的顶部)将会(从2.0开始)终止你的进程。不好。
即传递给Thread.Start
(等)的任何方法应该有一个try
/catch
,并做一些在catch
有用(日志记录,或许正常关机等)。
要做到这一点,你可以使用:
看看AppDomain.UnhandledException,它会帮助你至少记录那些你不处理异常,在某些情况下关闭“很好”:
此事件提供的 捕获的异常的通知。它允许 应用程序在系统 默认处理程序向用户报告例外 并终止 应用程序之前记录有关 异常的信息。如果关于应用程序状态的充足信息 是 可用,则可以采取其他行动 - 例如保存程序 数据以供以后恢复。小心 建议,因为程序数据可能 变得损坏时,例外是 未处理。
在.NET 4.0+中,您应该使用任务而不是线程。Here's a nice article的例外任务并行库
处理看一看
它会告诉你那一刻发生的任何异常,CLR寻找堆栈跟踪。事件参数还会告诉哪种类型的异常。您可以将其视为伐木的中心地点。
您可能还想捕获AppDomainUnloadedException。 MSDN:由于正在执行线程的应用程序域正在被卸载,所以在线程中抛出了AppDomainUnloadedException。 –