这是我与服务器通信的异步方法:
public static Task<bool> ValidateEmail(string email)
{
var url = ServerBase + Resources + Authorization + "check_existence";
var queryString = SerializationHelper.CreateQueryString(new Dictionary<object, object> {{"email", email}});
try
{
return
HttpHelper.PostAsync(url, queryString, null).ContinueWith(
json => SerializationHelper.DeserializeValidationResponse(json.Result));
} catch (Exception e)
{
return TaskErrorHelper.Error<bool>(e);
}
}
Run Code Online (Sandbox Code Playgroud)
DeserializeValidationResponse未捕获序列化服务器响应(来自方法)时抛出的异常.我究竟做错了什么?
UPD:TaskErrorHelper.Error代码:
internal static Task<T> Error<T>(Exception e)
{
var tcs = new TaskCompletionSource<T>();
tcs.SetException(e);
return tcs.Task;
}
Run Code Online (Sandbox Code Playgroud)
未捕获序列化服务器响应时引发的异常(来自DeserializeValidationResponse方法).我究竟做错了什么?
你没有做错任何事.你认为异常处理程序与延续有任何关系是错误的.让我们暂时离开它,并考虑一下:
class C
{
object obj = null;
Action action;
void M()
{
N();
action();
}
void N()
{
try
{
action = ()=>{Console.WriteLine(obj.ToString());};
}
catch (Exception ex)
{
Console.WriteLine("caught!");
}
}
Run Code Online (Sandbox Code Playgroud)
您是否相信catch处理程序应该捕获异常抛出的异常action()只是因为action碰巧是在具有处理程序的堆栈框架上创建的?
这不是例外的工作方式.
你的情况只是这个小程序的一个更复杂的版本.延迟委托直到异常处理程序消失后才运行.哎呀,延续可能甚至不会在同一个线程上运行!
那你怎么得到例外?如果continuation抛出异常,那么它将被自动捕获,异常将存储在任务中.然后,您可以将其从任务中拉出来.
或者,您可以重写程序以在继续中放置处理程序的副本:
public static Task<bool> ValidateEmail(string email)
{
var url = ...
var queryString = ...
try {
return HttpHelper.PostAsync(url, queryString, null).ContinueWith(
json => { try { ... } catch(Exception) { ... } });
} catch( ...
Run Code Online (Sandbox Code Playgroud)
或者,如果你async-await在C#5中使用,你会得到一些快乐:
public static async Task<bool> ValidateEmail(string email)
{
var url = ...
var queryString = ...
try
{
HttpResponseMessage json = await HttpHelper.PostAsync(url, queryString, null);
SerializationHelper.DeserializeValidationResponse(json.Result));
}
catch (Exception e)
{
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
现在,编译器会重写您的代码,以便它能够执行您想要的操作.好处await是你不必写任何这种疯狂的"继续"逻辑; 编译器为你做了.