在哪些情况下,try-catch会捕获异常?

CS.*_*S.R 0 scala exception try-catch

我刚刚开始学习Scala,所以这可能是一个简单的问题。我想使用try-catch块来检查变量是否已声明。

我正在使用try-catch块,并NoSuchElementException在变量不存在时捕获。

try{
  print(testVariable)
}
catch{
  case e: NoSuchElementException => print("testVariable not found")
}
Run Code Online (Sandbox Code Playgroud)

我的代码显示了一个testVariable不存在的错误,而不是引发异常。然后,我也尝试了多个其他异常,但是Scala的try-catch似乎没有捕获任何异常(除以零的异常除外)。

有人可以指导我如何使用Scala的try-catch块吗?

Dyl*_*lan 8

在Scala(或几乎所有编译的编程语言)中,检查变量是否已声明是编译器的工作,在编译时完成。如果您尝试使用尚未声明的变量,则编译器将给出错误消息,并且您的代码将无法运行。

异常是一种在运行时表示问题的方法。

“编译时间”和“运行时”之间没有重叠,因此您尝试执行的操作没有意义。那里只是没有对“变量不存在”一个例外,这就是为什么你不能抓住它。

相比之下,请看以下示例:

val map = Map('a' -> 1, 'b' -> 2)
map('c') // will throw NoSuchElementException because there is no 'c' in the map
Run Code Online (Sandbox Code Playgroud)

在这种情况下,map.apply('c')apply让您做的语法糖map('c')会抛出异常,因为这是Map的apply方法的实现方式。如果键不在地图Map#apply,请参见哪个定义调用Map#defaultMap#default抛出NoSuchElementException。

您可以通过try / catch捕获该异常,例如

try {
  map('c')
} catch {
   case e: NoSuchElementException =>
     println("got it!")
}
Run Code Online (Sandbox Code Playgroud)