Проблемы с «глобальными» обработчиками исключений для необработанных исключений в многопоточном WPF - PullRequest
3 голосов
/ 07 мая 2010

У меня есть программа, которая, помимо прочего, должна иметь возможность обновлять содержимое каталога, когда пользователь сообщает об этом. Фактическая задача на самом деле не имеет значения, но это самый простой способ вызвать эту проблему, о которой я знаю. Если я скажу ему открыть каталог, который не существует, я получу диалоговое окно «необработанное исключение» в VS с трассировкой стека, от внешнего к внутреннему:

[Внешний код]

Textbox PreviewKeyUp событие

[Внешний код]

Устанавливается свойство пути ClassA

вызывается функция обновления внутреннего пути ClassA

вызов события INotifyPropertyChanged

[Внешний код]

Вызов получателю для списка детей ClassB

Вызов функции внутреннего списка каталогов ClassB

И тогда он выходит из строя внутри этой внутренней функции. В моем App.xaml.cs есть следующее:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        Application.Current.Dispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);
    }

Но ни один из их обработчиков исключений не вызывается. Если я запускаю эту программу из-за пределов VS, я вообще не получаю уведомление об исключении, оно просто прерывается из-за неверного ввода. И да, вызывается событие Application_Startup. Как правильно «перехватить» это исключение, чтобы я мог предоставить дружественное сообщение об ошибке и убить программу?

О, и если я помещу попытку / перехват в стек вызовов после вызова внешнего кода, он тоже не перехватит.

[править]

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

1 Ответ

0 голосов
/ 07 мая 2010

Попробуйте подключиться к приложениям DispatcherUnhandledException.

private void Application_Startup(object sender, StartupEventArgs e)
{
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    Application.Current.Dispatcher.UnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(Dispatcher_UnhandledException);
    this.DispatcherUnhandledException += ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...