gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:49:47 26 4
gpt4 key购买 nike

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

我有一个执行特定操作的方法,例如,我正在发送一个 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 被标记为 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);
}
}

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com