Выбор ответа 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, а исключение кладётся в него позже.
Варианты ответа
try/catchвокруг вызова поймает ошибку, ведь сам вызов находится внутри блокаtry- Ошибка будет молча проигнорирована: Future без подписчиков ничего не сообщает в лог
- Станет необработанной ошибкой зоны:
try/catchвокруг вызова её не поймаетправильный ответ - Приложение во Flutter всегда сразу закроется, как при необработанном исключении в Java
Разбор
Без await функция возвращает Future, а исключение кладётся в него позже. Блок try к этому моменту уже завершён. Ошибка, которую никто не обработал, уходит в зону: во Flutter её ловит PlatformDispatcher.instance.onError или runZonedGuarded, обычно её видно в логе и в Crashlytics. Приложение не закрывается обязательно, но ошибка не обработана. Правильно: await в try или unawaited(...) с явным catchError.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.