Я хотел бы понять, когда использовать throw
и return Future.error
в асинхронных функциях. Есть ли какие-то принципиальные различия, которые мы должны учитывать при выборе одного или другого?
Я провел небольшой тест:
Future testFuture() async {
return Future.error('error from future');
}
void testThrow() {
throw('error from throw');
}
Future testFutureThrow() async {
throw('error from future throw');
}
main() async {
print('will run test');
try{
await testFuture();
}
catch(e){
print(e);
}
try{
testThrow();
}
catch(e){
print(e);
}
try{
await testFutureThrow();
}
catch(e){
print(e);
}
testFuture().catchError((e) => print(e));
testFutureThrow().catchError((e) => print(e));
print('did run test');
}
Кажется, что они оба работают одинаково. Это вывод:
will run test
error from future
error from throw
error from future throw
did run test
error from future
error from future throw
Из этого теста видно, что с точки зрения вызывающей стороны при вызове функции с использованием try/catch
код выполняется синхронно, а если мы Future.catchError
это асинхронно. Но с точки зрения потока функций это выглядит одинаково.
ПРИМЕЧАНИЕ: у меня это изначально было как ответ на вопрос. Но потом я понял, что не отвечаю, а задаю вопрос.