Почему обработчик App.DispatcherUnhandledException не перехватывает исключения, создаваемые конструктором приложения? - PullRequest
0 голосов
/ 23 января 2020

Пожалуйста, посмотрите на следующий код:

public partial class App : Application
{
        public App():base()
        {
                this.DispatcherUnhandledException += App_DispatcherUnhandledException;
                throw new InvalidOperationException("exception");
        }

        private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
                MessageBox.Show(e.Exception.Message);
                e.Handled = true;
        }
}

Почему обработчик не перехватывает исключение, сгенерированное конструктором приложения?

Ответы [ 3 ]

0 голосов
/ 23 января 2020

Экземпляр приложения не удалось построить, поэтому Application.Current не имеет никакого смысла. Вы должны подписаться на AppDomain.CurrentDomain.UnhandledException

public App() : base()
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
    throw new InvalidOperationException("exception");
}

private void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show(e.ExceptionObject.ToString());
}
0 голосов
/ 24 января 2020

Почему обработчик не перехватывает исключение, сгенерированное конструктором App?

Просто потому, что до создания App диспетчер не работал.

Это метод Main, сгенерированный для вас компилятором:

[STAThread]
static void Main(string[] args)
{
    App application = new App(); //<-- your throw here
    application.InitializeComponent();
    application.Run(); //<-- and there is no dispatcher until here
}

Из документов :

Когда Run называется, Application присоединяет новый экземпляр Dispatcher к потоку пользовательского интерфейса. Затем вызывается метод Run объекта Dispatcher, который запускает насос сообщений для обработки windows сообщений.

Вы не можете вызвать Run до того, как вы фактически создали App объект.

0 голосов
/ 23 января 2020

Я работал так же, чтобы сделать то же самое.

public partial class App : Application
{
        public App():base()
        {
                Application.Current.DispatcherUnhandledException += new
                   System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(
                      AppDispatcherUnhandledException);
                throw new InvalidOperationException("exception");
        }

void AppDispatcherUnhandledException(object sender,
           System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            //do whatever you need to do with the exception
            //e.Exception
              MessageBox.Show(e.Exception.Message);
                e.Handled = true;

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