Поймать исключения приложения в приложении Windows Forms - PullRequest
24 голосов
/ 09 июня 2011

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

Ответы [ 4 ]

37 голосов
/ 09 июня 2011

В приложениях Windows Forms, когда исключение генерируется где-либо в приложении (в основном потоке или во время асинхронных вызовов), вы можете перехватить его, зарегистрировавшись для события ThreadException в Приложении. Таким образом, вы можете обрабатывать все исключения одинаково.

Application.ThreadException += new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod);

private static void MyCommonExceptionHandlingMethod(object sender, ThreadExceptionEventArgs t)
{
    //Exception handling...
}
22 голосов
/ 09 июня 2011

Я думаю, что это близко, потому что вы можете получить то, что вы ищете в форме заявки на выигрыш.

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);

Без выполнения всех этих шагов вы рискуете получить некоторые исключения без обработки.

18 голосов
/ 09 июня 2011

Очевидный ответ - поместить обработчик исключений в начало вашей цепочки выполнения.

[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
    }
}

Это поймает любое исключение, которое происходит в вашем основном потоке GUI. Если вы также хотите глобально перехватывать исключения, возникающие во всех потоках, вы можете подписаться на событие AppDomain.UnhandledException и обработать его.

Application.ThreadException +=
    new ThreadExceptionEventHandler(MyCommonExceptionHandlingMethod)
private static void MyCommonExceptionHandlingMethod(
                                              object sender,
                                              ThreadExceptionEventArgs t)
{
    //Exception handling...
}

Код скопирован с Ответ Харит J

Теперь к совету ...

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

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

Извините, если вы уже знаете и делаете это.

4 голосов
/ 09 июня 2011

Вы можете подписаться на Событие AppDomain.UnhandledException

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...