5

在我们代码的几个地方,我们注意到如果在调试器下运行,它会显示代码中有一个未处理的异常,但是如果在调试器之外运行,它会完全忽略异常,就好像它被捕获一样。我们有一个异常处理程序,它会弹出一个错误提交对话框,该对话框连接到 Application.ThreadException 和 AppDomain.CurrentDomain.UnhandledException 并且这些似乎都没有捕获它们。我们还记录了我们的异常,日志中没有任何内容。

这有哪些可能的原因?

编辑:似乎它不依赖于异常抛出的类型,而是它被抛出的位置。只需添加以下内容即可对此进行测试:

throw new Exception("Test Exception");

它会显示在调试器下,但不会显示在外面,所以在我们的例子中,它不是 ThreadAbortedException 或任何依赖于它的特定类型的异常。

4

6 回答 6

2

有一些特殊的异常不会冒泡或捕获,听起来您正在处理其中之一:请参阅ThreadAbortException

于 2009-01-28T20:03:33.997 回答
1

发现可能发生这种情况的一个地方是 UnhandledException 事件处理程序中是否存在异常。一个简单的查看方法是:在 Form.Load 事件处理程序中抛出任何旧异常。在 Application.ThreadException 事件中放置类似于以下内容的内容:

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     string b = null;
     int i = b.Length;
}

在调试器下,它会显示您的异常未被用户代码处理,然后它会在 ThreadException 处理程序中显示空引用异常,但如果您在调试器之外运行它,它只会像处理一样吞下异常.

于 2009-01-28T21:58:21.270 回答
0

如果您尝试从创建控件的不同线程修改 Windows 窗体控件的属性,如果附加了调试器,则会收到InvalidOperationException,但否则会被静默忽略。

可以在此处找到有关此问题的更多信息:

http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx

于 2009-01-28T20:10:14.187 回答
0

您的代码是从框架中调用的。

有时,框架将其调用包装在异常处理程序中。

因此,如果您的代码中有异常,它可能(如果框架中有异常处理程序)被框架捕获并忽略。

也许调试器将其显示为“未处理”,因为尽管框架中有处理程序,但您的代码中没有处理程序?或者,因为框架中的处理程序有些奇怪,例如它是一个非托管的结构化异常处理程序?

于 2009-01-28T20:16:32.833 回答
0

您使用的是 .Net 1.0/1.1 吗?在从 1.1 到 2.0 的过渡过程中,行为发生了巨大变化。在此之前,您创建的线程或 ThreadPool 线程上引发的异常将被框架静默吞下,线程将退出。值得庆幸的是,此行为现已得到修复。

来自MSDN

从以前的版本更改

最重要的变化与托管线程有关。在 .NET Framework 版本 1.0 和 1.1 中,公共语言运行库在以下情况下为未处理的异常提供了支持:

  • 线程池线程上没有未处理的异常。当一个任务抛出一个它没有处理的异常时,运行时将异常堆栈跟踪打印到控制台,然后将线程返回到线程池。

  • 在使用 Thread 类的 Start 方法创建的线程上不存在未处理的异常。当在此类线程上运行的代码抛出它无法处理的异常时,运行时会将异常堆栈跟踪打印到控制台,然后优雅地终止线程。

  • 终结器线程上没有未处理的异常。当终结器抛出它不处理的异常时,运行时会将异常堆栈跟踪打印到控制台,然后允许终结器线程继续运行终结器。

于 2009-01-28T22:41:46.127 回答
0

Kind of a stretch here, but could it be that you just have set your debugger to break when an exception is thrown, and not only for the unhandled ones?

于 2010-01-04T12:04:51.183 回答