Поймай исключение, брошенное другой формой - PullRequest
4 голосов
/ 05 декабря 2011

Я пытаюсь сделать это:

Я создаю другую форму, которая в своем методе 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 ]

2 голосов
/ 05 декабря 2011

вы можете обработать все исключения в вашем проекте из 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 голосов
/ 05 декабря 2011

Я не думаю, что это может сработать, новая форма не работает в контексте вашего кода выше, она только запускается им.Если вы проверяете трассировку стека на предмет сгенерированного исключения, вы не должны видеть в нем приведенный выше код, поэтому он не может перехватить исключение.

Обновление: я только что создал тестовый проект и попробовал его.Stacktrace ничего не знает о первоначальной форме.Если вы хотите перехватывать необработанные исключения, вы можете задать этот вопрос Обработчик необработанных исключений в .NET 1.1

1 голос
/ 05 декабря 2011

Почему вы пытаетесь выбросить исключение из одной формы в другую? "Не выбрасывайте новое исключение ()"

Если вы пытаетесь сообщить основной форме, что форма параметров закрыта, вы можете просто установить флаг на главной форме, которыйустановить из формы параметров.

1 голос
/ 05 декабря 2011

Вы сможете сделать это следующим образом:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...