Почему мое исключение не пойман - PullRequest
0 голосов
/ 03 августа 2009

У меня есть приложение, которое смешивает Winforms и WPF. В Winforms у меня есть глобальный обработчик исключений, который определяется следующим образом:

AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
Application.ThreadException += Application_ThreadException;

Это ВСЕГДА ловит исключения в любом месте моего приложения, которые не ожидаются и обрабатываются изящно.

Для WPF все, что я могу записать, это:

 wpfAppDomain = new System.Windows.Application();
 wpfAppDomain.DispatcherUnhandledException +=
         wpfAppDomain_DispatcherUnhandledException;

Это не всегда ловит глобальные исключения, и я часто нахожу, что исключения проглатываются где-то, и я не уверен, почему.

Как создать глобальный обработчик исключений для WPF, который может перехватывать любое возникающее исключение, которое не обрабатывается?

Ответы [ 3 ]

1 голос
/ 04 августа 2009

Есть несколько случаев, когда этот код не будет перехватывать исключение и делает это специально

  • Исключение просто невозможно отловить. Например, выброшенное во время выполнения StackOverflowException
  • Исключение не обрабатывается в вашем коде, но попадает в базовую структуру WPF.

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

0 голосов
/ 04 августа 2009

DispatcherUnhandledException перехватывает только исключение из кода, вызванного диспетчером (как следует из названия), оно должно перехватывать исключения, выданные при вызове из кода WPF.

Он не распространяется на исключения, генерируемые из: WinForms, BackgroundWorker, пула потоков или потоков, которые вы запустили самостоятельно.

вы все еще можете использовать AppDomain.CurrentDomain.UnhandledException, чтобы перехватить их.

0 голосов
/ 04 августа 2009

Вы пробовали это после вызова SetUnhandledExceptionMode ? Как это:

// Force all exceptions through our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
...