使用任务处理来自异步方法的异常的问题

时间:2014-04-16 19:54:46

标签: c# asynchronous

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

我有一个执行特定操作的方法,例如,我发送了一个HttpWebRequest。在那里,我可以得到一个 WebException ,所以我将它放在一个Try-Catch块中,以重新抛出更具体的异常消息的异常。

就像那样:(这是一种名为 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 async。 为了现在处理错误,因为我知道它在async上有所不同,我创建了这个处理程序,你也可以在 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,或者那会起作用吗?如果没有,请告诉我该怎么做。但即使我在这里抛出一个没有任何查询的异常,它也没有在调试时抛出任何异常。那是为什么?

帮助表示赞赏。当事情不明确时,请问我。 ;)

1 个答案:

答案 0 :(得分:4)

你的延续是抛出异常,但是当该延续抛出异常时,所有发生的事件都是Task,它表示延续被标记为Faulted,给定的异常为Exception。您目前忽略了通过调用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);
    }
}