首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala try-catch-finally表达式可以没有大括号吗?

Scala try-catch-finally表达式可以没有大括号吗?
EN

Stack Overflow用户
提问于 2020-08-24 17:29:11
回答 2查看 119关注 0票数 0

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

Scala Syntax Specification中,它说:

代码语言:javascript
复制
Expr1             ::=  ‘try’ Expr [‘catch’ Expr] [‘finally’ Expr]
                     | ...

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

代码语言:javascript
复制
try
  println("Hello")
catch
  RuntimeException e => println("" + e)
finally
  println("World")

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

EN

回答 2

Stack Overflow用户

发布于 2020-08-24 18:02:53

好的。

代码语言:javascript
复制
import scala.util.control.NonFatal

def fourtyseven: PartialFunction[Throwable, Int] = {
  case NonFatal(_) => 47
}

def attempt(n: => Int): Int =
  try n catch fourtyseven finally println("done")

println(attempt(42))
println(attempt(sys.error("welp")))

尽管我必须单独定义catch表达式(因为它需要大括号),但它可以按预期编译和运行。

您可以尝试使用此代码here on Scastie

以下是几点注意事项:

  • try/catch/finally是一个返回值的表达式(如果你来自Java语言,这可能会有点陌生) --你可以了解更多关于它的内容,here on the docs
  • catch总是将PartialFunctionThrowable转换为某种类型,try/catch的总体返回类型是这两个类型中最接近的公共超类(例如,假设你有class Animal; class Dog extends Animal; class Cat extends Animal,如果try返回一个Dog,而catch返回一个Cat,则整个表达式将返回一个在catch partial函数中使用NonFatal提取器的catch,您可以在this answer中阅读有关它的更多信息,而提取器对象一般在this answer中描述
票数 4
EN

Stack Overflow用户

发布于 2020-08-24 18:42:06

Scala3 (Dotty)正在试验optional braces (显著缩进),因此下面的代码可以工作

代码语言:javascript
复制
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 = ()

其中我们注意到了处理程序

代码语言:javascript
复制
case e => println(s"good catch $e")

不需要像在Scala 2中那样的大括号。实际上,由于在catch关键字之后使用special treatment of case clauses,下面的代码也可以使用

代码语言:javascript
复制
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 = ()

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

代码语言:javascript
复制
catch
case e => println(s"good catch $e")
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63558249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档