Мы можем использовать несколько блоков catch в нашем коде. Multiple Catch Block в Kotlin используются, когда мы используем разные типы операций в блоке try, что может вызывать разные исключения в данном блоке.
Пример Multiple Catch блока
Давайте посмотрим на пример нескольких блоков catch. В этом примере мы будем выполнять различные типы операций. Эти разные типы операций могут генерировать разные типы исключений.
fun main(args: Array){
try {
val a = IntArray(5)
a[5] = 10 / 0
} catch(e: ArithmeticException) {
println("arithmetic exception catch")
} catch(e: ArrayIndexOutOfBoundsException) {
println("array index outofbounds exception")
} catch(e: Exception) {
println("parent exception class")
}
println("code after try catch...")
}
Выход:
arithmetic exception catch code after try catch...
Примечание. В каждый момент времени возникает только одно исключение и одновременно выполняется только один блок catch.
Правило: Все блоки catch должны располагаться от наиболее конкретных к общим, т. е. блокировка для ArithmeticException должна располагаться перед блокировкой для исключения.
Что происходит, когда мы переходим от общего исключения к конкретному?
Это будет генерировать предупреждение.
Пример:
Давайте изменим приведенный выше код и поместим блок catch из общего исключения в конкретное исключение.
fun main(args: Array){
try {
val a = IntArray(5)
a[5] = 10 / 0
}
catch(e: Exception) {
println("parent exception catch")
}
catch(e: ArithmeticException) {
println("arithmetic exception catch")
} catch(e: ArrayIndexOutOfBoundsException) {
println("array index outofbounds exception")
}
println("code after try catch...")
}
Вывод во время компиляции:
warning : division by zero a[5] = 10/0
Вывод во время выполнения:
parent exception catch code after try catch...
Мы также можем использовать вложенный блок try, когда это необходимо. Вложенный блок try-catch — это такой блок, в котором один блок try-catch внедряется в другой блок try.
Требование вложенного блока try-catch в Kotlin возникает, когда блок кода генерирует исключение, а в этом блоке другие операторы кода также генерируют другое исключение.
Синтаксис вложенного блока try
..
try
{
// code block
try
{
// code block
}
catch(e: SomeException)
{
}
}
catch(e: SomeException)
{
}
..
Пример вложенного блока try в Котлин
fun main(args: Array) {
val nume = intArrayOf(4, 8, 16, 32, 64, 128, 256, 512)
val deno = intArrayOf(2, 0, 4, 4, 0, 8)
try {
for(i in nume.indices) {
try {
println(nume[i].toString() + " / " + deno[i] + " is " + nume[i] / deno[i])
} catch(exc: ArithmeticException) {
println("Can't divided by Zero!")
}
}
} catch(exc: ArrayIndexOutOfBoundsException) {
println("Element not found.")
}
}
Выход:
4 / 2 is 2 Can't divided by Zero! 16 / 4 is 4 32 / 4 is 8 Can't divided by Zero! 128 / 8 is 16 Element not found.
