在我的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和最新版本。
答案 0 :(得分:0)
我认为您对Future.wait()
的命名有点误解。 Future.wait()
返回另一个Future,当每个Future成功完成时,它将具有List
个元素。
现在,由于Future.wait()
仍然是未来。您可以通过两种方式处理它:
await
与try catch
一起使用。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