【发布时间】:2019-05-30 19:49:18
【问题描述】:
我使用依赖异常的 Java 库。简化代码如下:
try {
val eventTime = eventTimeString.as[Date]
} catch {
case e: Exception =>
logger.error(s"Can't parse eventTime from $eventTimeString", e)
// take action for the bad Date string.
}
在 Java 中,我只会捕获将字符串解析为 Date 的异常,而让其余的不被捕获,因为它们可能是致命的。我的理解是,捕获Exception 意味着捕获任何非致命/非严重异常。因为它与捕获Throwable 不同,所以它是安全的——但它真的是这样吗?使用它的基本原理是未知异常可能会从堆栈的更深处抛出,如果它们不是致命的,为什么不捕获所有它们。这一直是 Java 中的一个问题,很容易从您正在进行的直接调用中找到可能的异常,而不是从更深层次的调用中找到可能的异常。这是 Scala 解决方案,基本上意味着“捕获所有可恢复的异常”吗?
我的问题是;上面的代码是否被认为是良好的 Scala 风格,是否“安全”,这意味着比仅捕获字符串到日期转换异常要好。
【问题讨论】:
-
是的,我已经看到了 monad 函数的用法,并且最终会转换。我在您的链接中看到,任何致命错误都不会创建
Failure,也不会绕过Success。对于致命错误,这可能是我们在上面的代码中想要的。 -
那么,这是否解决了您的问题? - 老实说,我仍然不清楚你的问题是什么。
-
这个问题部分是关于风格,部分是关于使用
Exception作为一个包罗万象的。你两个都回答了,如果你把它放在答案中,我会给你信用。 @Mario Galic 提供了一个很好的教程,但这不是我要求的。 -
我相信马里奥的回答比我写的更完整,他的回答中也包含了我提出的建议。最后还回答了 catchall 部分。所以我相信他的回答应该是公认的。不过,我很高兴我也提供了帮助 :)