В управляемом приложении GUI по умолчанию исключения, возникающие в потоке GUI, обрабатываются тем, что назначено для Application.ThreadException.
Исключения, возникающие в других потоках, обрабатываются AppDomain.CurrentDomain.UnhandledException.
Если вы хотите, чтобы ваши исключения потока GUI работали так же, как и исключения, не относящиеся к GUI, чтобы они обрабатывались AppDomain.CurrentDomain.UnhandledException, вы можете сделать это:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);
Преимущество перехвата исключений потоков в графическом интерфейсе с помощью ThreadException заключается в том, что вы можете использовать опции, позволяющие приложению продолжать работу. Чтобы убедиться, что никакие файлы конфигурации не переопределяют поведение по умолчанию, вы можете позвонить:
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Вы по-прежнему уязвимы к исключениям из плохо ведущих себя родных dll. Если нативный dll устанавливает свой собственный обработчик, используя Win32 SetUnhandledExceptionFilter, он должен сохранить указатель на предыдущий фильтр и вызвать его тоже. Если этого не произойдет, ваш обработчик не будет вызван.