我希望你能帮我解决这个问题。
我有一个执行特定操作的方法,例如,我正在发送一个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异步。为了现在处理错误,因为我知道它在异步上是不同的,所以我创建了这个处理程序,在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,或者它能工作吗?如果没有,请告诉我这里该怎么做。但是,即使我在这里抛出异常而没有任何查询,它也不会在调试时抛出任何异常。为什么会这样呢?
我们很感激你的帮助。当有什么不清楚的时候,问我。;)
发布于 2014-04-16 20:04:48
您的继续将抛出一个异常,但是当该延续抛出一个异常时,所发生的一切只是表示该延续的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);
    }
}https://stackoverflow.com/questions/23118917
复制相似问题