В чем разница между Future.error и Dart Future? - PullRequest
1 голос
/ 14 октября 2019

Я хотел бы понять, когда использовать 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 это асинхронно. Но с точки зрения потока функций это выглядит одинаково.

ПРИМЕЧАНИЕ: у меня это изначально было как ответ на вопрос. Но потом я понял, что не отвечаю, а задаю вопрос.

...