scala - try-catch 在哪些情况下会捕获异常?
问题描述
我刚开始学习 Scala,所以这可能是一个简单的问题。我想使用 try-catch 块来检查变量是否已被声明。
我正在使用 try-catch 块并捕获NoSuchElementException
变量是否不存在。
try{
print(testVariable)
}
catch{
case e: NoSuchElementException => print("testVariable not found")
}
我的代码显示一个testVariable
不存在的错误,而不是抛出异常。然后我也尝试了多个其他异常,但 Scala 的 try-catch 似乎没有捕获其中任何一个(除以零异常除外)。
有人可以指导我如何使用 Scala 的 try-catch 块吗?
解决方案
在 Scala(或几乎任何编译的编程语言)中,检查变量是否已声明是编译器的工作,在编译时完成。如果您尝试使用尚未声明的变量,编译器会报错,您的代码将无法运行。
异常是在运行时表示问题的一种方式。
“编译时”和“运行时”之间没有重叠,因此您尝试做的事情没有意义。“变量不存在”没有例外,这就是为什么你不能抓住它。
相比之下,举这个例子:
val map = Map('a' -> 1, 'b' -> 2)
map('c') // will throw NoSuchElementException because there is no 'c' in the map
在这种情况下,map.apply('c')
(syntax sugar for apply
let you domap('c')
将抛出异常,因为这就是 Map 的 apply 方法的实现方式。如果键不在 map 中,请参阅调用Map#default的定义Map#apply
;抛出 NoSuchElementException。Map#default
您可以使用 try/catch 捕获该异常,例如
try {
map('c')
} catch {
case e: NoSuchElementException =>
println("got it!")
}