gpt4 book ai didi

scala - 捕获异常对象是否安全

转载 作者:行者123 更新时间:2023-12-04 14:22:10 24 4
gpt4 key购买 nike

我使用依赖于异常的 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 风格,它是否“安全”,这意味着比只捕获字符串到 Date 转换异常要好。

最佳答案

解决问题的风格方面,Try ,正如@LuisMiguelMejiaSuarez 所建议的,提供了一种更惯用的 Scala 风格

Try(eventTimeString.as[Date]) match {
case Success(eventTimeDate) => // work with eventTimeDate
case Failure(e: IllegalArgumentException) => // work with e
case Failure(e: NullPointerException) => // work with e
...
case Failure(e) => // work with e
}

从语法上看,它看起来没有太大不同,但从概念上讲,这是一个很大的转变,因为 SuccessFailure代表常规值而不是一些特殊的控制结构。 Success是一个类似 7 的值是值,而 try-catch更像是 whileif-else控制设施。

包装可能抛出 Try 的任何库调用,比如说,由 Java 库提供,我们可以使用 for-yield 糖来像这样链接调用
for {
a <- Try(foo)
b <- Try(bar)
c <- Try(qux)
} yield {
// work with a, b and c
}

在哪里
def foo: Int = {
throw new TimeoutException("foo")
42
}

def bar: String = {
throw new IllegalArgumentException("bar")
"hello"
}

def qux: Boolean = {
throw new NullPointerException("qux")
true
}

我们可以按顺序阅读这条链,而不必打断我们的思路,并尝试了解一些特殊的控制结构如何适应算法。

关于问题的安全方面,可以说,我们不应该捕获诸如 LinkageError 之类的致命异常。 ,确实是 Try不符合以下异常
VirtualMachineError
ThreadDeath
InterruptedException
LinkageError
ControlThrowable

如图所示是 constructed
object Try {
def apply[T](r: => T): Try[T] =
try Success(r) catch {
case NonFatal(e) => Failure(e)
}
}

哪里 NonFatal
object NonFatal {
def apply(t: Throwable): Boolean = t match {
case _: VirtualMachineError | _: ThreadDeath | _: InterruptedException | _: LinkageError | _: ControlThrowable => false
case _ => true
}

def unapply(t: Throwable): Option[Throwable] = if (apply(t)) Some(t) else None
}

关于scala - 捕获异常对象是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56384762/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com