Future.wait()未捕获异常(飞镖)

时间:2019-11-18 10:39:42

标签: exception flutter dart

在我的Flutter应用程序中,我想同时进行多个网络通话,然后在它们全部完成后执行一些操作。为此,我使用Future.wait(),它可以满足我的需求。但是,当调用失败时,它将引发异常,该异常在某种程度上没有被异常处理程序捕获(即未捕获的异常)。

当我分别在await _fetchSomeData()之外Future.wait()进行操作时,异常处理程序确实会按预期方式调用该异常。

  Future<bool> someMethod() async {

    try {
      var results = await Future.wait([
        _fetchSomeData(),
        _fetchSomeOtherData()
      ]);
      //do some stuf when both have finished...
      return true;
    }
    on Exception catch(e) {
      //does not get triggered somehow...
      _handleError(e);
      return false;
    }
  } 

使用Future.wait()时我该怎么做才能捕获异常?

更新:

我已经缩小了范围。原来,如果您在Future.wait()所调用的方法中使用另一个await语句,则会导致问题。这里是一个例子:

  void _futureWaitTest() async {

    try {
      //await _someMethod(); //using this does not cause an uncaught exception, but the line below does
      await Future.wait([ _someMethod(), ]);
    }
    on Exception catch(e) {
      print(e);
    } 
  }

  Future<bool> _someMethod() async {
    await Future.delayed(Duration(seconds: 0), () => print('wait')); //removing this prevents the uncaught exception
    throw Exception('some exception');
  }

因此,如果您从_someMethod()中删除等待行,或者只是在_someMethod()之外调用Future.wait(),将防止未捕获的异常。当然这是最不幸的,我需要等待http调用... Dart中的一些错误?

我启用了“未捕获的异常”断点。如果我关闭此功能,问题似乎就不存在了。也许这是调试器的问题。我正在使用Visual Studio Code和最新版本。

2 个答案:

答案 0 :(得分:0)

我认为您对Future.wait()的命名有点误解。 Future.wait()返回另一个Future,当每个Future成功完成时,它将具有List个元素。

现在,由于Future.wait()仍然是未来。您可以通过两种方式处理它:

  1. awaittry catch一起使用。
  2. 使用onError回调。

Tis将类似于

Future.wait([futureOne, futureTwo])
.then((listOfValues) {
    print("ALL GOOD")
 }, 
 onError: (error) { print("Something is not ok") }

答案 1 :(得分:0)

在使用Future.wait()时我该怎么办才能捕获异常?

当我使用与您相同的代码时,在Future.wait()中使用的每个过程中的代码必须用try/catch包裹,并且在catch上必须返回{{ 1}}。另外,Future.error()必须设置为eagerError

true