Несколько блоков catch в Kotlin
В одном try может произойти сбой разного
типа. Если указать в catch только один
тип, остальные исключения не перехватятся
и программа остановится.
Решение - несколько блоков catch подряд.
Среда выполнения выбирает первый блок, тип
которого подходит к возникшему исключению:
try {
// risky code
} catch (e: NumberFormatException) {
// handle format
} catch (e: ArithmeticException) {
// handle division
}
Пусть функция делит два числа, переданные строками. Ошибка преобразования и деление на ноль обрабатываются разными сообщениями:
fun divideStrings(a: String, b: String) {
try {
val x = a.toInt()
val y = b.toInt()
println(x / y)
} catch (e: NumberFormatException) {
println("not a number")
} catch (e: ArithmeticException) {
println("division by zero")
}
}
fun main() {
divideStrings("10", "0")
divideStrings("10", "two")
}
Более конкретный catch ставят выше общего.
Если сначала написать широкий тип вроде
Exception, до узких типов выполнение
может не дойти. В начальных задачах достаточно
перечислять нужные типы по одному.
val data = listOf(1, 2, 3)
val indexStr = "x"
try {
val i = indexStr.toInt()
println(data[i])
} catch (e: NumberFormatException) {
println("bad index text")
} catch (e: IndexOutOfBoundsException) {
println("bad index value")
}
Даны строки left и right.
В try преобразуйте обе в Int
и выведите частное первого на второе.
Для NumberFormatException выведите
"parse", для ArithmeticException
выведите "zero".
Дан список и строка с индексом. В одном try
получите индекс и элемент
списка. Отдельными catch обработайте
NumberFormatException и
IndexOutOfBoundsException разными
сообщениями на английском.