У меня есть программа, которая, помимо прочего, должна иметь возможность обновлять содержимое каталога, когда пользователь сообщает об этом. Фактическая задача на самом деле не имеет значения, но это самый простой способ вызвать эту проблему, о которой я знаю.
Если я скажу ему открыть каталог, который не существует, я получу диалоговое окно «необработанное исключение» в 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 не использует исключения привязки.
Я оставляю это открытым, если у кого-то есть какие-либо дальнейшие идеи, но я думаю, что лучшее, что я могу сделать, - это отказаться от ленивой загрузки, если я думаю, что это может привести к исключениям, по крайней мере, до тех пор, пока приложение не станет более проверенным.