c# - 在 C# 中处理异步 HttpWebRequest 异常的最佳方法是什么?

标签 c# .net asynchronous httpwebrequest

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

我想做的是通过在传递给每个回调方法的状态对象中保存异常来处理错误。如果捕获到异常,状态对象将被更新,然后 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; }
    }

最佳答案

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

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

你通常会用 try/catch block 做一个非常相似的检查,所以这应该不会带来不便。如果您真的担心这一点,只需使用同步方法创建一个新线程并使用继续选项处理异常:

Task.Factory.StartNew(() => { DoWork(); })
.ContinueWith(t => Logger.Error("An exception occurred while processing. Check the inner exception for details", t.Exception),
TaskContinuationOptions.OnlyOnFaulted);

关于c# - 在 C# 中处理异步 HttpWebRequest 异常的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6132197/

相关文章:

.NET 不使用 DLL

c# - 需要将 Controller 的操作方法调用到 c# mvc 中的另一个类中

javascript - 使用 Javascript 的 HiddenFields 中的空值

c# - 在 C# 中动态识别属性

c# - 需要从 .Net 2 升级到更新的版本?

c# - .NET 版本的 HTML Tidy?

c# - 同步延续到底什么时候是危险的?

javascript - 在 Node.js 和 sails.js 中链接异步函数

c# - 说丢弃任务的非异步方法位于异步等待链的 "top"是否正确?

c# - 使用 Random 类随机化二维数组