原文: https://beginnersbook.com/2019/03/kotlin-multiple-catch-blocks/

try块可以有多个catch块。当我们不确定try块内是否会发生所有异常时,为潜在的异常设置多个catch块总是一个好主意,并且在最后一个 catch 块中有父异常类来处理未指定的剩余异常通过catch块。

Kotlin 多个catch块的例子

在下面的示例中,我们有多个catch块,但是当发生异常时,它会查找该特定异常的处理程序。

这里发生的异常是算术异常,但是前两个catch块没有处理算术异常,这就是为什么执行第三个catch块的代码。第三个块处理所有异常,因为它使用Exception类,它是所有异常类的父类。

  1. fun main(args: Array<String>) {
  2. try{
  3. var num = 10/0
  4. println(num)
  5. }
  6. catch(e: NumberFormatException){
  7. println("Number format exception")
  8. }
  9. catch(e: ArrayIndexOutOfBoundsException){
  10. println("Array index is out of range")
  11. }
  12. catch(e: Exception){
  13. println("Some Exception occurred")
  14. }
  15. println("Out of try catch block")
  16. }

输出:

Kotlin 多个`catch`块 - 图1

多个catch块的另一个例子

下面是多个catch块的另一个例子,这里发生了ArrayIndexOutOfBoundsException,因为这个异常存在一个处理程序(catch块),执行处理程序内部的代码。

  1. fun main(args: Array<String>) {
  2. try{
  3. val a = IntArray(5)
  4. a[10] = 99
  5. }
  6. catch(e: ArithmeticException){
  7. println("ArithmeticException occurred")
  8. }
  9. catch(e: NumberFormatException){
  10. println("Number format exception")
  11. }
  12. catch(e: ArrayIndexOutOfBoundsException){
  13. println("Array index is out of range")
  14. }
  15. catch(e: Exception){
  16. println("Some error occurred")
  17. }
  18. println("Out of try catch block")
  19. }

输出:

Kotlin 多个`catch`块 - 图2

为什么在最后一个catch块中使用父Exception类是个好主意

让我们采用我们上面的相同示例,但在此代码中,我们做了一个小改动。这里我们首先得到父Exception类的处理程序(catch块)。

在代码中发生了ArrayIndexOutOfBoundsException并且我们有这个特殊异常的处理程序,但是因为我们首先有一般的Exception类,它处理所有异常所以它被执行而不是处理ArrayIndexOutOfBoundsExceptioncatch块。

以顺序方式检查catch块,以便执行第一个catch块,实际上在任何异常的情况下,第一个catch将执行,这是一个糟糕的编程习惯,因为我们想要一个特定的消息而不是一般化的消息。因此,解决方案是在最后一个位置使用此默认处理程序,就像我们在上面的示例中所做的那样。

  1. fun main(args: Array<String>) {
  2. try{
  3. val a = IntArray(5)
  4. a[10] = 99
  5. }
  6. catch(e: Exception){
  7. println("Some error occurred")
  8. }
  9. catch(e: ArithmeticException){
  10. println("ArithmeticException occurred")
  11. }
  12. catch(e: NumberFormatException){
  13. println("Number format exception")
  14. }
  15. catch(e: ArrayIndexOutOfBoundsException){
  16. println("Array index is out of range")
  17. }
  18. println("Out of try catch block")
  19. }

输出:

Kotlin 多个`catch`块 - 图3