2009-11-03 74 views
16

我们有一个接口IPoller,为此我们有各种实现。我们有一个进程将采取一个IPoller并在一个单独的线程中启动它。我试图想出一个通用的方法来为任何不自己执行它的IPollers提供异常处理。.NET线程抛出异常时会发生什么?

我最初的想法是创建一个IPoller的实现,它可以接受一个I​​Poller,并提供一些日志记录功能。我遇到的问题是如何提供这种错误处理?如果我有IPoller.Start()这是线程的目标是哪里发生异常?或者我可以挂钩的线程上有什么东西?

回答

19

喜欢的东西:

Thread thread = new Thread(delegate() { 
    try 
    { 
     MyIPoller.Start(); 
    } 
    catch(ThreadAbortException) 
    { 
    } 
    catch(Exception ex) 
    { 
     //handle 
    } 
    finally 
    { 
    } 
}); 

这将确保异常不会使它到达线程的顶部。

+0

您可能还想捕获AppDomainUnloadedException。 MSDN:由于正在执行线程的应用程序域正在被卸载,所以在线程中抛出了AppDomainUnloadedException。 –

9

您应该在线程顶部使用的方法处捕获异常,并从那里进行日志记录。

一个未处理的异常(在一个线程的顶部)将会(从2.0开始)终止你的进程。不好。

即传递给Thread.Start(等)的任何方法应该有一个try/catch,并做一些在catch有用(日志记录,或许正常关机等)。

要做到这一点,你可以使用:

  • 静态测井方法
  • 捕获变量纳入委托(如匿名方法)
  • 暴露你的方法就已经知道的记录器实例
3

看看AppDomain.UnhandledException,它会帮助你至少记录那些你不处理异常,在某些情况下关闭“很好”:

此事件提供的 捕获的异常的通知。它允许 应用程序在系统 默认处理程序向用户报告例外 并终止 应用程序之前记录有关 异常的信息。如果关于应用程序状态的充足信息 是 可用,则可以采取其他行动 - 例如保存程序 数据以供以后恢复。小心 建议,因为程序数据可能 变得损坏时,例外是 未处理。

0

处理看一看

Appdomain.FirstChanceException event

它会告诉你那一刻发生的任何异常,CLR寻找堆栈跟踪。事件参数还会告诉哪种类型的异常。您可以将其视为伐木的中心地点。

相关问题