Multiple Catch и вложенные блоки try в Kotlin

Мы можем использовать несколько блоков 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. 

Оцените статью