AppDomain.CurrentDomain.UnhandledException не срабатывает без отладки - PullRequest
14 голосов
/ 19 августа 2009

У меня есть программа .NET с обработчиком событий, связанным с Application.CurrentDomain.UnhandledException. При запуске программы с отладкой это событие вызывается при возникновении необработанного исключения. Однако при запуске без отладки событие не запускается.

В чем моя проблема?

Спасибо, Andrew

Ответы [ 2 ]

16 голосов
/ 19 августа 2009

Полагаю, вы не установили правильный режим обработки исключений с помощью Application.SetUnhandledExceptionMode() - просто установите его на UnhandledExceptionMode.ThrowException.

UPDATE

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

using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication
{
    public static class Program
    {
        static void Main()
        {
            AppDomain.CurrentDomain.UnhandledException += AppDomain_UnhandledException;

            Application.ThreadException += Application_ThreadException;
            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

            Application.Run(new TestForm());

            throw new Exception("Main");
        }

        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 class TestForm : Form
    {
        public TestForm()
        {
            this.Text = "Test Application";
            this.ClientSize = new Size(200, 60);
            this.MinimumSize = this.Size;
            this.MaximumSize = this.Size;
            this.StartPosition = FormStartPosition.CenterScreen;

            Button btnThrowException = new Button();

            btnThrowException.Text = "Throw";
            btnThrowException.Location = new Point(0, 0);
            btnThrowException.Size = new Size(200, 30);
            btnThrowException.Click += (s, e) => { throw new Exception("Throw"); };

            Button btnThrowExceptionOnOtherThread = new Button();

            btnThrowExceptionOnOtherThread.Text = "Throw on other thread";
            btnThrowExceptionOnOtherThread.Location = new Point(0, 30);
            btnThrowExceptionOnOtherThread.Size = new Size(200, 30);
            btnThrowExceptionOnOtherThread.Click += (s, e) => new Thread(() => { throw new Exception("Other thread"); }).Start();

            this.Controls.Add(btnThrowException);
            this.Controls.Add(btnThrowExceptionOnOtherThread);
        }
    }
}
0 голосов
/ 19 августа 2009

Возможно, исключение выдается в отдельном потоке в вашем приложении. Мы видели проблему приложения, просто «останавливающего» (означает: одна секунда - там, а вторая - нет), когда в потоке возникает необработанное исключение. В этом случае даже не обработанный обработчик исключений сработал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...