簡體   English   中英

捕獲另一個表單拋出的異常

[英]Catch an Exception thrown by another form

我正在嘗試這樣做:

我正在創建另一個表單,其中的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();
}

調試器在此消息的異常上停止:

用戶代碼未處理異常

為什么? 我正在捕獲創建它的對象的所有者的異常。 有人有想法嗎?

我不認為這可以工作,新表單不是在上面的代碼上下文中運行,它只是由它啟動。 如果你檢查堆棧跟蹤是否拋出了異常,你就不應該在其中看到上面的代碼,因此它無法捕獲異常。

更新:我剛剛創建了一個測試項目並嘗試了它。 stacktrace對原始表單一無所知。 如果你想捕獲未處理的異常,你可能想看看這個問題.NET 1.1中的Unhandled Exception Handler

您可以從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");
            }
        }

你可以這樣做:

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);
        }
    }
}

你為什么要嘗試從一種形式到另一種形式的異常? “不要拋出新的異常()”

如果您試圖讓主表單知道選項表單已關閉,您可以在主表單上有一個標志,該標志是從選項表單中設置的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM