Есть ли все-таки, чтобы поймать ожидания, которые выбрасываются где-нибудь в коде? Я хотел бы перехватывать исключения и обрабатывать их аналогичным образом, а не писать блок catch catch для каждой функциональности.
Исключения в Catch приложениях в приложении Windows Forms
Ответ 1
В приложениях Windows Forms, когда исключение выбрасывается где угодно в приложении (в основном потоке или во время асинхронных вызовов), вы можете поймать его, зарегистрировавшись для события ThreadException в приложении. Таким образом, вы можете обрабатывать все исключения таким же образом.
Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod)
private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t)
{
//Exception handling...
}
Ответ 2
Я думаю, что это близко, так как вы можете получить то, что ищете в приложении формы выигрыша.
http://msdn.microsoft.com/en-us/library/ms157905.aspx
// Add the event handler for handling UI thread exceptions to the event.
Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);
// Set the unhandled exception mode to force all Windows Forms errors to go through
// our handler.
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
// Add the event handler for handling non-UI thread exceptions to the event.
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
Без выполнения всех этих шагов вы рискуете получить некоторые исключения, которые будут обработаны без ошибок.
Ответ 3
Очевидным ответом является установка обработчика исключений в верхней части вашей цепочки выполнения.
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
try
{
Application.Run(new YourTopLevelForm());
}
catch
{
//Some last resort handler unware of the context of the actual exception
}
}
Это приведет к любым исключениям, возникающим в вашем основном потоке графического интерфейса. Если вы также хотите глобально перехватывать исключения, которые встречаются во всех потоках, вы можете подписаться на AppDomain.UnhandledException и обрабатывать там.
Application.ThreadException +=
new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod)
private static void MyCommonExceptionHandlingMethod(
object sender,
ThreadExceptionEventArgs t)
{
//Exception handling...
}
Код, скопированный из Ответ Charith J
Теперь по совету...
Эти параметры следует использовать только в качестве крайней меры, скажем, если вы хотите пресекать случайно неперехваченные исключения из представления пользователю. Вы должны ловить скорее, когда это возможно, когда вы знаете что-то о контексте исключения. Еще лучше, вы можете что-то сделать с проблемой.
Обработка структурированных исключений может показаться ненужной накладной, которую вы можете обойти с уловкой, но она существует, потому что это не так. Более того, эта работа должна быть выполнена, поскольку код написан, когда разработчик имеет новую логику в своем уме. Не ленитесь и оставите эту работу позже или еще для того, чтобы найти более опытного разработчика.
Извините, если вы уже знаете это и делаете это.
Ответ 4
См. AppDomain.UnhandledException
и Application.ThreadException
.
Ответ 5
Вы можете подписаться на Событие AppDomain.UnhandledException