调试UnhandledException事件时,为什么Visual Studio会循环

(这看起来非常类似于来自另一个线程的C#UnhandledException保持循环 ,但我没有尝试在这里捕获exception,只是有机会记录一些东西)

我有一些非常简单的C#代码设置UnhandledException事件处理程序,然后抛出exception:

class Program { static void Main(string[] args) { AppDomain currentDomain = AppDomain.CurrentDomain; //currentDomain.UnhandledException += new UnhandledExceptionEventHandler(currentDomain_UnhandledException); currentDomain.UnhandledException += (sender, eventArgs) => { var exception = (Exception) eventArgs.ExceptionObject; Console.WriteLine("Unhandled exception: " + exception.Message); }; throw new AccessViolationException("Bleurgh"); } } 

它的行为与我期望从控制台一样:

 Unhandled exception: Bleurgh Unhandled Exception: System.AccessViolationException: Bleurgh at UnhandledExceptions.Program.Main(String[] args) in c:\code\sandbox\UnhandledExceptions\UnhandledExceptions\Program.cs:line 20 

但是当我尝试在Visual Studio中调试它时,它进入一个循环,进入事件处理程序,然后退出以重新抛出exception。

当我将处理程序表示为一个独特的静态方法时,会发生同样的事情。

有什么想法正在发生什么?

这是在Visual Studio 2010中。编辑:和.NET 4。

它似乎取决于ExceptionAssistant的行为。 当您继续时,助手会将调用堆栈展开到抛出exception的位置 – 这会导致exception被重新抛出。 我假设这是允许您进行更改,以避免exception。

如果在Tools \ Options \ Debugger \ General下取消选中“在未处理的exception上展开调用堆栈”,那么它只会表现为独立进程的行为,并且您将看到进程终止。

这就是调试器的工作原理,或者我们应该说是一个“function”。 如果进程是由调试器创建的(F5),则调试器将阻止进程终止,并指向可能导致进程终止的代码行。 那些“未处理的exception”实际上是由调试器处理的,因此执行永远不会到达您的代码。

如果在创建进程后将调试器附加到进程(Ctrl + F5,然后附加),则调试器最终将到达未处理的exception“处理程序”,但在退出处理程序后,它仍将阻止进程终止,并将您带回exception发生的地方。