Ошибка асинхронного кода в Dart
Если Future завершается с ошибкой, она
долетает до места, где стоит await.
Блок try вокруг await позволяет
обработать сбой и продолжить программу.
Если ошибку никто не ждет в try, выполнение
программы обрывается, когда необработанный
Future завершится с ошибкой.
Намеренный сбой в async-функции можно
поймать по типу исключения:
Future<void> boom() async {
throw StateError("boom");
}
void main() async {
try {
await boom();
} on StateError catch (e) {
print(e.message);
}
print("alive");
}
Сообщение исключения попадает в обработчик, затем
печатается "alive". Поток main
не обрывается на необработанном сбое.
Для данных с неверным форматом удобен
FormatException:
Future<String> load() async {
throw FormatException("bad line");
}
void main() async {
try {
var text = await load();
print(text);
} on FormatException catch (e) {
print(e);
}
}
Тот же прием работает, когда сбой возникает при
вычислении внутри async-функции:
Future<int> divide() async {
var n = 0;
return 5 ~/ n;
}
void main() async {
try {
var bad = await divide();
print(bad);
} on IntegerDivisionByZeroException {
print("fix input");
}
}
В async-функции бросьте StateError
с текстом "fail". Оберните await
в try и напечатайте "handled"
в обработчике.
Фоновая async-функция бросает
ArgumentError с сообщением
"bad id". Перехватите его вокруг
await и выведите сообщение
исключения.