繁体   English   中英

处理带有任务的异步方法中的异常的问题

[英]Problems with handling exceptions from async method with tasks

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

我有一个执行特定操作的方法,例如,我正在发送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 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,否则行得通吗? 如果没有,请告诉我在这里做什么。 但是,即使我在这里抛出没有任何查询的异常时,在调试时也没有抛出任何异常。 这是为什么?

感谢帮助。 当不清楚的时候,问我。 ;)

您的延续引发异常,但是当该延续引发异常时,所有发生的事情就是代表该延续的Task被标记为Faulted,给定的异常为其Exception。 当前,您正在忽略通过调用ContinueWith创建的任务,因此没有任何可观察到的异常。

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

还要注意,您可以使用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);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM