📅  最后修改于: 2023-12-03 15:05:04.954000             🧑  作者: Mango
异常处理在一些需要处理错误、可能出现异常情况的语言中扮演着重要的角色,Scala也不例外。本文将介绍Scala异常处理的相关内容。
Scala的异常处理与Java基本相同。当一个异常被抛出时,会在当前的上下文中寻找第一个处理该异常的catch字句。如果当前上下文中没有对应的catch字句,则异常会向上抛出直至被处理或者程序终止。
Scala中的异常类继承自Throwable
类,这和Java中是一样的。Throwable
类有两个直接子类:Error
和Exception
。其中Error
表示JVM运行时出现的无法处理的错误,如OutOfMemoryError
;Exception
表示程序中出现的可处理的异常,如ArithmeticException
。
下面是Scala异常类层次结构的UML图:
----------- Throwable ----------
| |
---------- ---------
| | | |
Error Exception ControlException
| |
RuntimeException ExceptionInInitializerError
其中,ControlException
是所有控制异常的抽象类,RuntimeException
是所有RuntimeException异常类的抽象父类,ExceptionInInitializerError
指异常在静态成员变量或静态初始化块中被抛出。
Scala中使用关键字throw
来抛出一个异常。示例如下:
if (num < 0)
throw new IllegalArgumentException("num应大于等于0")
如果Scala提供的异常类不足以满足需求,可以自定义异常类。自定义异常类一般要继承Exception
或其子类。示例如下:
class MyException(s: String) extends Exception(s)
if (num < 0)
throw new MyException("num应大于等于0")
Scala中使用try-catch
语句来捕获异常。示例如下:
try {
// 可能抛出异常的代码
}
catch {
case ex: Exception => // 处理异常
}
finally {
// 可选,无论是否抛出异常都会被执行
}
其中,catch
字句可以带有一个或多个模式匹配表达式来捕获特定类型的异常,如:
try {
// 可能抛出异常的代码
}
catch {
case ex: IOException => // 处理IOException异常
case ex: Exception => // 处理其他异常
}