如何在C#中处理异步HttpWebRequest异常的最佳方法?

6
我正在编写一些代码,使用HttpWebRequest进行异步处理。如果你之前做过这个,那么你应该知道错误处理可能有点麻烦,因为如果在回调方法中抛出异常,它无法通过try/catch块传递回调用代码。
我想要做的是通过保存异常在我的状态对象中来处理错误,该状态对象会传递给每个回调方法。如果捕获到异常,状态对象将被更新,然后http调用将被中止。我的问题是,在我的状态对象中,我必须使用一个异常属性,以便可以存储任何类型的异常。当调用代码检查状态对象并“看到”异常时,它不知道是什么类型的异常。
有没有一种方法允许我的状态对象持有任何类型的异常,但仍然保持异常强类型化? 状态对象
public class HttpPostClientAsyncModel
    {
        public HttpResponseSnapshot Response { get; set; }
        public HttpPostClientAsyncStatus Status { get; set; }
        public Exception Exception { get; set; }
        public WebRequest Request { get; set; }
    }

调用代码可以在try块内直接抛出model.Exception,然后设置捕获特定的异常子类型,以便调用者可以适当地处理。或者也许不需要... :) - dlev
这只是为了学习体验吗?HttpWebRequest.BeginGetResponse有什么问题? - Bas Bossink
1个回答

1

异常对象仍然保持其强类型并保留其原始字段值。您只需要像这样检查它:

if (asyncModel.Exception is ArgumentException)
{
  // Handle argument exception here
  string invalidParameter = (asyncModel.Exception as ArgumentException).ParamName;
}
else if (...)
{
}

通常情况下,您会通过try/catch块执行非常类似的检查,因此这不应该造成不便。如果您真的很担心这个问题,只需使用同步方法创建一个新线程,并使用继续选项处理异常。
Task.Factory.StartNew(() => { DoWork(); })
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception),
TaskContinuationOptions.OnlyOnFaulted);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接