如何为正在进行异步WebClient调用的winforms app创建全局异常处理程序

时间:2012-01-05 18:18:29

标签: c# .net winforms exception-handling callback

我有一个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应用程序中使用异步回调时寻找最佳实践。

修改

尼古拉斯......谢谢你的回答。因此,我可以将整个回调放入try catch中,然后执行catch操作。或者我必须显式检查AsyncCompletedEventArgs.error属性是否为非null值。

如果它是非null的......你能告诉我如何使回调错误冒泡到我的全局异常处理程序吗?

我想我会这样做......

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 个答案:

答案 0 :(得分:3)

任何异常都将传递给您的DownloadFileCompleted事件处理程序。

使用AsyncCompletedEventArgs对象调用此对象,该对象具有Error属性。

您只需要在处理程序中检查此属性 - 它不会是“未处理的异常”。

答案 1 :(得分:0)

是的,AppDomain.CurrentDomain.UnhandledException是处理未以其他方式处理的任何异常的方法。

但是,一般来说,你应该在我称之为最外边缘的地方使用异常处理程序,特别是:控制事件,回调等等。