我希望你能解决这个问题。
我有一个执行特定操作的方法,例如,我发送了一个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 async。 为了现在处理错误,因为我知道它在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,或者那会起作用吗?如果没有,请告诉我该怎么做。但即使我在这里抛出一个没有任何查询的异常,它也没有在调试时抛出任何异常。那是为什么?
帮助表示赞赏。当事情不明确时,请问我。 ;)
答案 0 :(得分:4)
你的延续是抛出异常,但是当该延续抛出异常时,所有发生的事件都是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);
}
}