我有一个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();
}
我相信我是正确的,Application.ThreadException不会捕获Callback事件引发的应用程序错误?那么,确保处理回调异常的最佳方法是什么?
我在其他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);
}
赛斯
解决方法:
任何异常都将传递给您的DownloadFileCompleted事件处理程序.
这是通过具有错误属性的AsyncCompletedEventArgs对象调用的.
您只需要在处理程序中检查此属性-它不会是“未处理的异常”.