Несколько блоков catch в Dart
В одном try может произойти сбой разного
типа. Если указать в catch только один
тип, остальные исключения не перехватятся
и программа остановится.
Решение - несколько блоков catch подряд.
Среда выполнения выбирает первый блок, тип
которого подходит к возникшему исключению.
Запишем общий вид:
try {
// risky code
} on FormatException catch (e) {
// handle format
} on UnsupportedError catch (e) {
// handle division
}
Функция ниже делит два числа, переданные строками. Ошибка преобразования и деление на ноль обрабатываются разными сообщениями:
void divideStrings(String a, String b) {
try {
var x = int.parse(a);
var y = int.parse(b);
print(x ~/ y);
} on FormatException catch (e) {
print("not a number");
} on UnsupportedError catch (e) {
print("division by zero");
}
}
divideStrings("10", "0");
divideStrings("10", "two");
Более конкретный catch ставят выше общего.
Если сначала написать широкий перехват без
on, до узких типов выполнение может
не дойти. В начальных задачах достаточно
перечислять нужные типы по одному.
var data = [1, 2, 3];
var indexStr = "x";
try {
var i = int.parse(indexStr);
print(data[i]);
} on FormatException catch (e) {
print("bad index text");
} on RangeError catch (e) {
print("bad index value");
}
Даны строки left и right.
Преобразуйте обе в целые числа и выведите
частное первого на второе через ~/.
Для FormatException выведите "parse",
для UnsupportedError
выведите "zero".
Дан список и строка с индексом. Получите индекс
и элемент списка в одной конструкции.
Обработайте FormatException и
RangeError разными сообщениями
на английском.