当.NET线程抛出异常时会发生什么?

时间:2009-11-03 16:51:53

标签: c# .net multithreading exception exception-handling

我们有一个接口IPoller,我们有各种各样的实现。我们有一个进程将接受一个I​​Poller并在一个单独的线程中启动它。我试图想出一种为任何不自行处理的IPoller提供异常处理的通用方法。

我最初的想法是创建一个接受IPoller的IPoller实现,并提供一些日志记录功能。我遇到的问题是如何提供此错误处理?如果我有IPoller.Start()这是Thread的目标,那将发生异常?或者我可以在线程中找到什么东西?

5 个答案:

答案 0 :(得分:20)

类似的东西:

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

这将确保异常不会使其成为线程的顶部。

答案 1 :(得分:11)

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

未处理的异常(在线程顶部)将(在2.0以后)终止您的进程。不好。

即。你传递给Thread.Start(等)的方法应该有try / catch,并在catch中做一些有用的事情(记录,也许是优雅的关闭等)。< / p>

要实现这一目标,您可以使用:

  • 静态日志记录方法
  • 将捕获的变量捕获到委托中(作为匿名方法)
  • 在已经了解记录器的实例上公开您的方法

答案 2 :(得分:8)

在.NET 4.0+中,您应该使用Tasks而不是线程。关于任务并行库中的异常处理的Here's a nice article

答案 3 :(得分:4)

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

  

此事件提供通知   没有被捕的例外。它允许   应用程序记录有关的信息   系统之前的例外   默认处理程序报告异常   给用户并终止   应用。如果信息充足   关于应用程序的状态是   可用,其他行动可能是   承担 - 例如储蓄计划   数据供以后恢复。小心是   建议,因为程序数据可以   异常时会被破坏   没处理。

答案 4 :(得分:0)

看看

  

Appdomain.FirstChanceException event

它告诉你任何异常发生的时刻,CLR正在寻找堆栈跟踪。事件参数也告诉了哪种类型的异常。您可以将其视为记录的中心位置。