捕获另一个表单抛出的异常

时间:2011-12-05 04:29:48

标签: c# winforms exception exception-handling

我正在尝试这样做:

我正在创建另一个表单,其中的FormClosed方法抛出异常,应该由主表单捕获。

主要表格:

try
    {
        frmOptions frm  = new frmOptions();
        frm.ShowDialog();                        
    }
catch(Exception)
    {
        MessageBox.Show("Exception caught.");
    }

frmOptions:

private void frmOptions_FormClosed(object sender, FormClosedEventArgs e)
{
    throw new Exception();
}

调试器使用以下消息停止异常:

  

用户代码

未处理异常

为什么呢?我正在捕获创建它的对象的所有者的异常。有人有想法吗?

4 个答案:

答案 0 :(得分:2)

我认为这不起作用,新表单不会在上面的代码上下文中运行,它只是由它启动。如果检查stacktrace是否抛出异常,则不应该在其中看到上面的代码,因此它无法捕获异常。

更新:我刚刚创建了一个测试项目&试了一下。 stacktrace对原始表单一无所知。如果您想捕获未处理的例外,可能需要查看此问题Unhandled Exception Handler in .NET 1.1

答案 1 :(得分:2)

您可以从program.cs处理项目中的所有异常

static class Program
        {

            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;

                Application.ThreadException += Application_ThreadException;
                Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);         
                Application.Run(new MainMDI());              
            }
            static void Application_ThreadException(Object sender, ThreadExceptionEventArgs e)
            {
                MessageBox.Show(e.Exception.Message, "Application.ThreadException");
            }

            static void AppDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e)
            {
                MessageBox.Show(((Exception)e.ExceptionObject).Message, "AppDomain.UnhandledException");
            }
        }

答案 2 :(得分:1)

您可以按照以下方式执行此操作:

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

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2(this);
        form2.Show();
    }

    public void HandleForm2Exception(Exception ex)
    {
        MessageBox.Show("EXCEPTION HAPPENED!");
    }
}

和Form2.cs

public partial class Form2 : Form
{
    private Form1 form1;

    public Form2(Form1 form1) : this()
    {
        this.form1 = form1;
    }

    public Form2()
    {
        InitializeComponent();
    }

    private void Form2_FormClosed(object sender, FormClosedEventArgs e)
    {
        try
        {
            throw new Exception();
        }
        catch (Exception ex)
        {
            if(this.form1 != null)
                this.form1.HandleForm2Exception(ex);
        }
    }
}

答案 3 :(得分:1)

为什么要尝试从一种形式向另一种形式抛出异常? "Don't throw new Exception()"

如果您试图让主表单知道选项表单已关闭,您可以在主表单上有一个标志,该标志是从选项表单中设置的。