【问题标题】:Windows: exceptions not handled in main threadWindows:主线程中未处理的异常
【发布时间】:2016-02-25 09:21:25
【问题描述】:

在windows中是否可以忽略主线程中未处理的异常?

我了解操作系统希望在主线程中停止一个未处理异常的进程。但是为什么 System.Threading.Timer 任务的线程产生中未处理的异常会在 Windows 中产生这个“你想打开调试器”对话框吗?

是的,您总是可以将整个任务包装在一个 try/catch-all 块中,但我觉得这很奇怪。

注意:我尝试了一个简单的命令行程序,它在 Timer 对象中有一个引发异常的任务(几秒钟后) - 似乎仍然无法阻止 Windows 终止进程。

【问题讨论】:

  • "要打开调试器吗?" (因为这个程序发生了故障)......认真地处理你的异常,不要试图吞下它们。以后会狠狠地咬你。如果您希望发生某个异常,请编写代码来处理它。这样,当意外发生时,您就不会被蒙在鼓里。
  • 我尝试设置一个全局异常处理程序,就像在 JVM (drdobbs.com/jvm/uncaught-java-thread-exceptions/240148320) 中一样,但这在 Windows 上不起作用。我敢打赌,在这个平台上我必须习惯这一点。

标签: c# multithreading exception-handling


【解决方案1】:

如果您的踏板即使在异常发生后仍能继续工作,那么全局 try catch wrap 就足够了。问题是,您的线程是否能够在异常后继续?该异常对您的线程有多重要?如果这很重要,你不想知道发生了什么吗?

如果您不知道异常是如何发生的并且您不想将漏洞代码包装到 try catch 中,您可以使用 UnhandledException 处理程序来记录错误,以便将来更正它。

这是 vb.net 中的一个示例:

Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler


Sub MyHandler(ByVal sender As Object, ByVal args As UnhandledExceptionEventArgs)
    Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
End Sub 'MyUnhandledExceptionEventHandler

【讨论】:

  • 感谢@Reven,但以上不起作用。它只是将一个处理程序添加到处理程序列表中,以便您可以进行一些清理。但是线程仍然会导致程序死掉。我敢打赌,唯一的选择是始终将回调包装在 try/catch 块中。
猜你喜欢
  • 2011-07-31
  • 2010-12-23
  • 2014-09-10
  • 1970-01-01
  • 1970-01-01
  • 2013-06-06
  • 2011-05-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多