【问题标题】:Future throw exception handle outside from origin future来自原始未来之外的未来抛出异常句柄
【发布时间】:2014-06-17 07:21:06
【问题描述】:

我想了解飞镖未来异常是如何工作的。我读了一篇关于它的非常好的文章link。但是当我嵌套了未来并且他们中的第一个抛出错误时,我如何在第二个未来处理这个错误。

为了澄清,我的意思是看下面的示例。

import 'dart:async';

void main() {

  var fur1 = new Future<int>(() => 45);
  fur1.then((value) {
    throw new StateError('Hello error');
  });

  var fur2 = new Future<int>(() => 24);
  fur2.then((value) {
    fur1.then((value1) {
      print(value1);
    });
    print(value);
  }).catchError((err) => print(err));
}

在 fur1 中,我抛出一个异常,并期望在 fur2 中捕获错误,但编译器显示消息

未处理的异常:错误状态:Hello 错误

以后可以处理嵌套错误吗?我知道,我可以在这里使用完成者类,也许它会是解决方案?

【问题讨论】:

    标签: dart dart-async


    【解决方案1】:

    我不确定你实际上想要完成什么。

    但对我来说是这样的

    import 'dart:async';
    
    void main() {
    
      var fur1 = new Future<int>(() => 45);
    //  fur1.then((value) {
    //    throw new StateError('Hello error');
    //  });
    
      var fur2 = new Future<int>(() => 24);
      fur2.then((value) {
        var x = fur1.then((value1) {
          print(value1);
            throw new StateError('Hello error'); // <= inner exception
          });
          print(value);
          return x; // <= return future
        }).catchError((err) => print('catchError: ${err}'));
      }
    

    或者这样

    import 'dart:async';
    
    void main() {
    
      var fur1 = new Future<int>(() => 45);
      fur1.then((value) {
        throw new StateError('Hello1 error');
      }).catchError((err) => print('catchError1: ${err}'));
    
      var fur2 = new Future<int>(() => 24);
      fur2.then((value) {
        var x = fur1.then((value1) {
          print(value1);
          throw new StateError('Hello2 error'); // <= inner exception
        });
        print(value);
        return x; // <= return future
      }).catchError((err) => print('catchError2: ${err}'));
    }
    
    catchError1: Bad state: Hello1 error
    24
    45
    catchError2: Bad state: Hello2 error
    

    【讨论】:

    • 这正是我想要完成的!非常感谢。
    • 原程序失败的原因是fur1 上的侦听器是在完成并出现错误后添加的。这意味着该错误被认为是未处理的,并且它成为顶级未捕获错误。 fur1 上的监听器被添加到另一个未来的 then 处理程序中,这将在未来的某个时间点触发,这恰好是在 fur1 未来完成之后。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 2016-05-10
    • 2015-05-19
    • 2019-12-10
    • 2017-02-12
    相关资源
    最近更新 更多