Scala try-catch-finally 表达式可以不带大括号吗?

lin*_*bin 0 scala

我正在学习 Scala,并对try-catch-finally语法感到困惑。

\n

Scala 语法规范中,它说:

\n
Expr1             ::=  \xe2\x80\x98try\xe2\x80\x99 Expr [\xe2\x80\x98catch\xe2\x80\x99 Expr] [\xe2\x80\x98finally\xe2\x80\x99 Expr]\n                     | ...\n
Run Code Online (Sandbox Code Playgroud)\n

我可以编写没有{ }块的表达式吗,如下所示:

\n
try\n  println("Hello")\ncatch\n  RuntimeException e => println("" + e)\nfinally\n  println("World")\n
Run Code Online (Sandbox Code Playgroud)\n

或者表达式必须是块表达式?

\n

Mar*_*lic 5

Scala 3 (Dotty) 正在尝试使用可选的大括号(显着缩进),因此以下工作

scala> try
     |   1 / 0
     | catch
     |   case e => println(s"good catch $e")
     | finally
     |   println("Celebration dance :)")
     |
good catch java.lang.ArithmeticException: / by zero
Celebration dance :)
val res1: AnyVal = ()
Run Code Online (Sandbox Code Playgroud)

我们注意到处理程序的地方

case e => println(s"good catch $e")
Run Code Online (Sandbox Code Playgroud)

不需要像Scala 2中那样的大括号。事实上,由于关键字后子句的特殊处理,casecatch以下内容也可以工作

scala> try
     |   1 / 0
     | catch
     | case e => println(s"good catch $e")
     | finally
     |   println("Celebration dance :)")
     |
good catch java.lang.ArithmeticException: / by zero
Celebration dance :)
val res2: AnyVal = ()
Run Code Online (Sandbox Code Playgroud)

我们注意到处理程序不必在之后缩进catch

catch
case e => println(s"good catch $e")
Run Code Online (Sandbox Code Playgroud)