我希望你能帮我解决这个问题。
我有一个执行特定操作的方法,例如,我正在发送 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
,并将给定的异常作为其异常。您当前忽略了通过调用 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/