【发布时间】:2019-12-27 13:53:30
【问题描述】:
这段代码中有奇怪的语法:
var result =
try {
Process(bl).!!
} catch {
case e: Exception =>
log.error(s"Error on query: ${hql}\n")
"Etc etc" + "Query: " + hql
}
为什么不在log.error(s"...") 之后使用, 或; 之类的分隔符?
catch 语句返回一个或两个值?
PS:有更好的Guide tham this one,具有所有 Scala 语法替代方案?
【问题讨论】:
-
为什么要放置分隔符? - 我的意思是,语法对我来说很清楚。
catch是一个block (类似于match)。并且所有try都必须返回一个值,在这种情况下,两个分支都返回一个String。 -
嗨 @LuisMiguelMejíaSuárez,当我使用现代 Javascript (ES6+) 时,
x=>y很明显,x=>y z是一个错误。我没有看到“两个分支”.. Scala 语言指南说有y,z而不仅仅是y? -
我还是不明白你的意思?
try block catch (macth expr block)+是 try 表达式 的语法。与该语言中的任何其他 表达式 一样,它必须返回一个值。 try expression 的返回类型是 try-block 的返回类型和所有 catch-macth-blocks 的返回类型之间的 LUB (在这种情况下只有一个,在这种情况下都返回 Strings)。 - 此外,与语言中的任何其他块一样,您可以使用;分隔语句,但如果您每行只写一个语句,它们是可选的。 - 我还是不明白为什么这会让你感到困惑。 -
@LuisMiguelMejíaSuárez 感谢正则表达式,
try block catch (macth expr block)+这接近我正在寻找的答案,+让一切变得不同。在this official Guide 中有一个带有两个块的(macth expr block)+示例,但是您和指南没有显示我的问题的块语法。在我的问题上,我们只有一个区块,比如case foo: FooException => handleFooException(foo); handleBarException(bar),这很奇怪。 -
并非如此,因为每个匹配项后面都有一个块。如果您想自己保持理智,可以这样做:
} catch { \n case e: Exception => {\n log(...) \n "ect" \n } \n }(如果您复制和粘贴,\n会告诉您在哪里换行,因为 cmets 不会保留它)。正如你所看到的,我们在比赛结束后开始了一个新的街区。只是,编译器允许你省略这些括号,大多数人都会这样做。