什么';s是处理C#中异步HttpWebRequest异常的最佳方法

本文关键字:HttpWebRequest 异步 异常 方法 最佳 处理 什么 | 更新日期: 2023-09-27 17:57:45

我正在编写一些异步使用HttpWebRequest的代码。如果你们中的任何人以前都这样做过,那么你就会知道错误处理可能会有点痛苦,因为如果在某个回调方法中抛出异常,则无法通过try/catch块将其传递回调用代码。

我想做的是通过在传递给每个回调方法的状态对象中保存异常来处理错误。如果捕捉到异常,则会更新状态对象,然后中止http调用。我遇到的问题是,在我的状态对象中,我必须使用Exception属性,以便可以存储任何类型的异常。当调用代码检查状态对象并"看到"异常时,它不知道它是什么类型的异常

有没有一种方法可以允许我的状态对象保存任何类型的异常,但仍然保持强类型的异常?

状态对象

public class HttpPostClientAsyncModel
    {
        public HttpResponseSnapshot Response { get; set; }
        public HttpPostClientAsyncStatus Status { get; set; }
        public Exception Exception { get; set; }
        public WebRequest Request { get; set; }
    }

什么';s是处理C#中异步HttpWebRequest异常的最佳方法

异常对象仍然是强类型的,并保留其原始字段值。你只需要这样检查:

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