Подтвердить что ты не робот

Исключения в Catch приложениях в приложении Windows Forms

Есть ли все-таки, чтобы поймать ожидания, которые выбрасываются где-нибудь в коде? Я хотел бы перехватывать исключения и обрабатывать их аналогичным образом, а не писать блок catch catch для каждой функциональности.

4b9b3361

Ответ 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.