有如下代码:
Future<String> checkCode(String code){
return Future((){
sleep(Duration(seconds:2));
if (code=="8888") {
return "success -> $code";
}
else{
//操作失败,直接抛出异常
throw Exception("bad code! -> $code");
}
});
}
在进行异常处理的时候,如果按照如下两种方式进行调用,得到的结果会有所不同。
方式一:
checkCode("9999").then((String value){
print(value);
}).catchError((err){
print(err);//直接输出bad code! -> 9999
});
方式二:
var ret = checkCode("9999");
ret.then((String value){
print(value);
});
ret.catchError((err){
print("// $err //");
});
方式二中的代码,执行后,输出结果如下:
// Exception: bad code! -> 9999 //
Unhandled exception:
Exception: bad code! -> 9999
#0 checkCode.<anonymous closure> (file:///.../%E4%B8%AD%E7%9A%84%E5%BC%82%E6%AD%A5%E6%93%8D%E4%BD%9C/01_%E5%AF%B9Future%E7%9A%84%E8%AE%A4%E8%AF%86.dart:38:7)
#1 new Future.<anonymous closure> (dart:async/future.dart:175:37)
#2 Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.dart:18:15)
#3 _Timer._runTimers (dart:isolate-patch/timer_impl.dart:397:19)
#4 _Timer._handleMessage (dart:isolate-patch/timer_impl.dart:428:5)
#5 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:168:12)
可以看到,除了正常的捕捉到的error的输出,还会输出一堆报错信息,就像没有对错误进行处理一样。
将代码二作如下处理:
代码三:
var ret1 = checkCode("9999");
print(ret1.hashCode);
var ret2 = ret1.then((String value){
print(value);
});
print(ret2.hashCode);
ret2.catchError((err){
print(err);
});
代码三实际上就是代码一的调用方式,只不过是将代码一的链式调用拆开来写,并添加了一些变量来接收返回值,输出返回值的hashCode。通过hashCode可以看出,在then调用后返回的future已经不是原来的future。猜想dart内部应该是对一些ret1进行了处理,如果ret2进行了错误处理,则不再输出报错的调用信息。