使用Visual Studio 2013 Ultimate进行调试时允许运行UnhandledException事件处理程序

时间:2015-09-13 22:01:39

标签: vb.net debugging visual-studio-2013 visual-studio-debugging unhandled-exception

我有一个WinForms应用程序,它使用Application.UnhandledException来显示一个对话框,提示用户报告错误。当应用程序发布并独立运行时,它可以正常工作(除了明显的问题,即有一个未处理的异常浮动)。

为了测试对它的更改,我一直试图在点击按钮时抛出异常。不幸的是,调试器妨碍了。它将在异常中中断(这在其他情况下不是问题,因为我想知道某些内容是错误的)并且不让我继续进入UnhandledException处理程序,而是告诉我每次单击“继续”按钮时都不会处理异常。我已经尝试禁用中断任何异常,特定类型的异常和选项屏幕中的Just My Code选项无效。

有没有办法禁用此行为?

根据要求,

下面的Repro代码。它来自一个标准的,通用或花园的WinForms应用程序,在启动表单上只有一个按钮(ThrowButton)。默认情况下,在创建项目时启用应用程序框架。

Form1.vb的

Public Class Form1
    Private Sub ThrowButton_Click(sender As Object, e As EventArgs) Handles ThrowButton.Click
        Throw New Exception
    End Sub
End Class

ApplicationEvents.vb的

Namespace My
    Partial Friend Class MyApplication

        Private Sub MyApplication_UnhandledException(sender As Object, e As ApplicationServices.UnhandledExceptionEventArgs) Handles Me.UnhandledException
            MsgBox("Application event")
        End Sub
    End Class
End Namespace

我还在驱动器上放了一个解决方案的副本,以防有用。我在上传之前对其进行了扫描,但显然无法保证在此之后会发生什么。 https://drive.google.com/file/d/0By6VJrYK_X0-QklFWWYtSDBPblU/view?usp=sharing

1 个答案:

答案 0 :(得分:1)

在OP编写用于下载的VB.NET代码之前,给出了C#代码的答案。可能它仍然对某人有用。如果您不同意,请将其标记为非答案。

C#行为遵循MSDN steps for exception dispatching,其在步骤3中说明:

  

...但是正在调试该进程,系统第二次通知调试器。

考虑像

这样的代码
static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
    throw  new Exception("Help! I am unhandled!");
}

private static void OnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine("Caught unhandled exception.");
    Console.WriteLine(e.IsTerminating ? "Terminating" : "Not terminating");
}

我说的是预期Visual Studio的行为。

  1. 执行未处理的异常处理程序(您可以通过查看控制台输出来验证)
  2. 该过程将终止,因为您无法将异常设置为处理程序中处理的
  3. 在进程终止之前,调试器会跳转到
  4. 同样的问题不仅发生在Visual Studio中,而且发生在WinDbg中(运行相同的可执行文件):

    0:000> .exr -1
    ExceptionAddress: 750bc42d (KERNELBASE!RaiseException+0x00000058)
       ExceptionCode: e0434352 (CLR exception)
      ExceptionFlags: 00000001
    NumberParameters: 5
       Parameter[0]: 80131500
       Parameter[1]: 00000000
       Parameter[2]: 00000000
       Parameter[3]: 00000000
       Parameter[4]: 713e0000
    
    0:000> !pe
    Exception object: 02573148
    Exception type:   System.Exception
    Message:          Help! I am unhandled!
    InnerException:   <none>
    StackTrace (generated):
        SP       IP       Function
        0038F0DC 001D04B4 UnhandledExceptionHandler!UnhandledExceptionHandler.Program.Main(System.String[])+0x6c
    
    StackTraceString: <none>
    HResult: 80131500
    

    异常标志告诉我们这是第二次机会异常。