C# WinForms应用程序中的异常处理行为,该应用程序使用模态对话框

C# WinForms应用程序中的异常处理行为,该应用程序使用模态对话框,c#,winforms,exception-handling,C#,Winforms,Exception Handling,我遇到过这样的情况。 WinForms应用程序有两种形式。主窗体有一个按钮,当用户单击它时,将显示模式对话框。对话框窗体也有一个按钮,当用户单击它时,会引发异常 当应用程序在调试器下运行且自身运行时,异常处理不同。 下面是复制此行为的最小代码: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Cli

我遇到过这样的情况。 WinForms应用程序有两种形式。主窗体有一个按钮,当用户单击它时,将显示模式对话框。对话框窗体也有一个按钮,当用户单击它时,会引发异常

当应用程序在调试器下运行且自身运行时,异常处理不同。 下面是复制此行为的最小代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            using (var dialog = new Form2())
            {
                dialog.ShowDialog();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Oops! " + ex.Message);
        }
    }
}

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
调试时,引发异常将关闭对话框,Form1.button1\u Click中的异常处理程序将处理异常

运行应用程序本身时,引发异常不会关闭对话框。而不是调用默认的Application.ThreadException处理程序


为什么(以及为什么)行为不同?如何使其相互一致?

在您的程序中尝试此方法。Main()

原因与Windows窗体程序集在Visual Studio宿主进程之外运行的方式有关。 见此:

如果将上述代码行设置为:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
在VS中运行它,您将看到默认行为是什么——一旦您在代码中跳过初始异常,就会显示您所引用的对话框。默认设置只是根据您是在托管模式还是独立模式下运行而有所不同

嗯,“为什么”在MS链接中有所涉及-错误发生在不同线程上的事件处理程序中。默认行为是仅在WinForms下以不同的方式处理此问题。如果在调用对话框后放置此行:

throw new Exception("Bah!");

并将该行为保持在CatchException上,您将看到它会像您所期望的那样进入您的异常处理程序。这只是事件处理程序中处理方式不同的异常。希望能有所帮助。

谢谢!这是对我问题中“如何”部分的回答。“为什么和为什么”仍然是真实的…理解;“为什么/为什么”我认为这只是.NET框架的一个怪癖。我可能会被纠正,我想知道是否有人知道根据应用程序运行的上下文,这种行为会有所不同的原因。我同意这有点难对付。
throw new Exception("Bah!");