c# - 使用任务处理异步方法异常的问题

标签 c# asynchronous

我希望你能帮我解决这个问题。

我有一个执行特定操作的方法,例如,我正在发送 HttpWebRequest。在那里我可以获得一个 WebException,因此我将其放入 Try-Catch block 中,以便针对更具体的异常消息重新抛出异常。

就像这样:(这是在一个名为 doWebRequest 的方法中)

try 
{
   // HttpWebRequest here
}

catch (WebException ex)
{
  throw new WebException(String.Format("My special additional message {0}", ex.Message);
}

好吧,当我正常调用这个函数时,这是有效的。 但现在我想要一种异步方式来做到这一点。我在异步方法中调用此方法所做的操作:

public void DoRequestAsync() 
{
   Task internalRequest = new Task(doWebRequest);
   internalRequest.ContinueWith(InternalUpdateSearchExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
   internalRequest.Start();
}

因此,这会创建一个新任务,然后异步调用方法doWebRequest。 现在为了处理错误,因为我知道异步情况有所不同,所以我创建了这个处理程序,您也可以在 internalRequest.ContinueWith 中看到它。看起来像这样:

private void InternalUpdateSearchExceptionHandler(Task task)
{
  var ex = task.Exception;
  if (ex.InnerException is WebException)
  {
     if ((ex.InnerException as WebException).Status == WebExceptionStatus.ProtocolError)
     {
        throw new WebException(ex.InnerException.Message);
     }

     else
     {
        throw new Exception("There was no response from the server.");
     }
  }
}

但这并没有执行任何异常。我不知道为什么。 起初我想,这是因为它不能将 InnerException 作为 WebException,或者这样可以吗?如果没有,请告诉我在这里该怎么做。但即使我在这里抛出一个没有任何查询的异常,它在调试时也不会抛出任何异常。这是为什么?

感谢帮助。有什么不清楚的可以问我。 ;)

最佳答案

您的延续正在引发异常,但是当该延续引发异常时,所发生的一切都是表示该延续被标记为“故障”的 Task ,并将给定的异常作为其异常。您当前忽略了通过调用 ContinueWith 创建的任务,因此没有任何东西可以观察到此异常。

DoRequestAsync 可能不应该是 void;相反,它应该返回一个 Task,特别是通过调用 ContinueWith 创建的任务,以便调用此方法的任何人都可以观察到抛出的任何异常。

另请注意,您可以使用async更简单地完成此操作:

public async Task DoRequestAsync() 
{
    try 
    {
        var content = await new WebClient()
            .DownloadStringTaskAsync("address");
    }
    catch (WebException ex)
    {
      throw new WebException(String.Format("My special additional message {0}", ex.Message);
    }
}

关于c# - 使用任务处理异步方法异常的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23118917/

相关文章:

c# - 覆盖 ASP.NET Core 1.0 MVC 中的全局授权过滤器

c# - 如何使用一个固定参数和集合中的另一个参数编写 Parallel.ForEach?

c# - 将我自己的类传递给对象

c# - 从 .NET 中的 t 分数计算百分位数

python - 尽管等待 API 响应,但使用 asyncio 没有加速

javascript - 强制异步调用以同步方式运行

c# - 如何在不使用内部主题<T,U>的情况下链接变革性 ISubject<T,U>

node.js - 如何循环遍历链接并为 PhantomJS 中的每个站点执行 jQuery javascript

python - 扭曲的克莱因 : Synchronous behavior

php - WP插件中的异步php代码