Как создать глобальный обработчик исключений для приложения winforms, которое выполняет асинхронные вызовы WebClient - PullRequest
3 голосов
/ 05 января 2012

У меня есть приложение winforms, которое выполняет асинхронные вызовы WebClient с помощью процедур обратного вызова следующим образом ...

using (var wc = new WebClient())
{
    wc.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadCompleted);
    wc.DownloadProgressChanged+=new DownloadProgressChangedEventHandler(DownloadProgressCallback);
    //other stuff
    wc.DownloadFileAsync(uri, fullLocalPath);
}

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

[STAThread]
static void Main()
{
    Application.ThreadException += new ThreadExceptionEventHandler(ApplicationThreadException);
    //other stuff
    Application.Exit();

}

private static void ApplicationThreadException(object sender, ThreadExceptionEventArgs e)
{
    // Do logging or whatever here

    Application.Exit();
}

Я считаю, что я прав, что ошибки приложения, вызванные событием Callback, не будут обнаружены Application.ThreadException? Так каков наилучший способ обеспечения обработки исключений обратного вызова?

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

Я просто ищу рекомендации по использованию асинхронных обратных вызовов в приложении winforms.

EDIT

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

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

Я думаю, я бы сделал это так ...

private void DownloadCompleted(object sender, AsyncCompletedEventArgs e)
{

    if (e.Error != null)
    {
        throw e.Error;
    }

    if (DownloadHasCompleted == null) return;
    File.Copy(this.RemoteIniFilePath, this.CurrentIniFilePath, true);
    DownloadHasCompleted(this, e);
}

Сет

Ответы [ 2 ]

3 голосов
/ 05 января 2012

Любое исключение будет передано вашему DownloadFileCompleted обработчику событий.

Это вызывается с AsyncCompletedEventArgs объектом, обладающим свойством Error.

Вам просто нужно проверить это свойство в вашем обработчике - оно не будет "необработанным исключением".

0 голосов
/ 05 января 2012

Да, AppDomain.CurrentDomain.UnhandledException - это способ обработки любых исключений, которые не обрабатываются иначе.

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

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