阅读 63

Dart异步操作的时候,错误处理的一个细节

有如下代码:

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进行了错误处理,则不再输出报错的调用信息。

文章分类
前端
文章标签