Выбор ответа Senior Dart: Future, Stream, изоляты обновлено

Dart: ошибка в Future без await

Вопрос

Что произойдёт с исключением внутри save(), если вызвать её без await и без обработчика?

Future<void> save() async {
  throw Exception('диск полон');
}

void onTap() {
  try {
    save();
  } catch (e) {
    print('поймали $e');
  }
}

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

Выберите вариант, и откроется разбор.

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

Коротко

Правильный ответ: Станет необработанной ошибкой зоны: try/catch вокруг вызова её не поймает. Без await функция возвращает Future, а исключение кладётся в него позже.

Варианты ответа

  1. try/catch вокруг вызова поймает ошибку, ведь сам вызов находится внутри блока try
  2. Ошибка будет молча проигнорирована: Future без подписчиков ничего не сообщает в лог
  3. Станет необработанной ошибкой зоны: try/catch вокруг вызова её не поймаетправильный ответ
  4. Приложение во Flutter всегда сразу закроется, как при необработанном исключении в Java

Разбор

Без await функция возвращает Future, а исключение кладётся в него позже. Блок try к этому моменту уже завершён. Ошибка, которую никто не обработал, уходит в зону: во Flutter её ловит PlatformDispatcher.instance.onError или runZonedGuarded, обычно её видно в логе и в Crashlytics. Приложение не закрывается обязательно, но ошибка не обработана. Правильно: await в try или unawaited(...) с явным catchError.

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

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