首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >处理带有任务的异步方法异常的问题

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

Stack Overflow用户
提问于 2014-04-16 19:54:46
回答 1查看 630关注 0票数 2

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

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

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

代码语言:javascript
运行
复制
try 
{
   // HttpWebRequest here
}

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

好吧,所以当我正常调用这个函数时,这个函数就能工作了。但是现在我想要一种异步的方式来完成这个任务。我在异步方法中调用此方法所做的工作:

代码语言:javascript
运行
复制
public void DoRequestAsync() 
{
   Task internalRequest = new Task(doWebRequest);
   internalRequest.ContinueWith(InternalUpdateSearchExceptionHandler, TaskContinuationOptions.OnlyOnFaulted);
   internalRequest.Start();
}

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

代码语言:javascript
运行
复制
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,或者它能工作吗?如果没有,请告诉我这里该怎么做。但是,即使我在这里抛出异常而没有任何查询,它也不会在调试时抛出任何异常。为什么会这样呢?

我们很感激你的帮助。当有什么不清楚的时候,问我。;)

EN

回答 1

Stack Overflow用户

发布于 2014-04-16 20:04:48

您的继续将抛出一个异常,但是当该延续抛出一个异常时,所发生的一切只是表示该延续的Task被标记为错误,而给定的异常被标记为其异常。您当前忽略了通过调用ContinueWith创建的任务,因此没有什么可以观察到此异常。

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

还请注意,您可以使用async进行更多的操作。

代码语言:javascript
运行
复制
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);
    }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23118917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档