Что выведет код Middle Dart: Future, Stream, изоляты обновлено

Dart: try/catch с await и без

Вопрос

Что выведет программа? По строке на каждый вывод.

Future<void> fail() async {
  throw StateError('упс');
}

Future<void> main() async {
  try {
    await fail();
  } catch (e) {
    print('с await: поймали');
  }
  final f = fail();
  print('без await: дальше');
  try {
    await f;
  } on StateError catch (e) {
    print('поймали позже: ${e.message}');
  }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: с await: поймали, без await: дальше, поймали позже: упс. С await исключение из Future выбрасывается в точке ожидания и ловится catch.

Что выведет

с await: поймали
без await: дальше
поймали позже: упс

Разбор

С await исключение из Future выбрасывается в точке ожидания и ловится catch. Без await вызов просто возвращает Future с ошибкой, код идёт дальше. Ошибку можно получить позже, дождавшись этого же Future. Если бы его так никто и не дождался, ошибка стала бы необработанной.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.