gpt4 book ai didi

scala - 异常应该是案例类吗?

转载 作者:行者123 更新时间:2023-12-03 06:14:18 31 4
gpt4 key购买 nike

我的自定义异常类型应该是case classes吗?

从好的方面来说,我有提取器。

不利的一面是,我得到了不正确的相等语义。但我可以通过重写 equals 来避免这种情况。

那么,在概念层面上,将它们设为case class有意义吗?

最佳答案

这当然是非常主观的,但在我看来,将异常类作为案例类是很好的做法。主要理由是,当您捕获异常时,您正在执行模式匹配,并且案例类在模式匹配中使用要好得多。下面的示例在使用案例类异常时,充分利用了 catch block 中模式匹配的全部功能:

object IOErrorType extends Enumeration {
val FileNotFound, DeviceError, LockedFile = Value
}
case class IOError(message: String, errorType: IOErrorType.Value) extends Exception(message)

def doSomeIO() { throw IOError("Oops, file not found!", IOErrorType.FileNotFound) }

try {
doSomeIO()
} catch {
case IOError( msg, IOErrorType.FileNotFound ) =>
println("File not found, please check the path! (" + msg + ")")
}

在此示例中,我们只有一个异常(exception),但它包含 errorType当您想知道发生的确切错误类型时(通常这是通过异常层次结构建模的,我并不是说这是更好或更坏,该示例只是说明性的)。因为IOError是一个案例类,我可以简单地做 case IOError( msg, IOErrorType.FileNotFound )仅捕获错误类型 IOErrorType.FileNotFound 的异常。如果没有我们通过案例类免费获得的提取器,我每次都必须捕获异常,然后在我实际上不感兴趣的情况下重新抛出,这肯定更冗长。

您说案例类给您提供了不正确的相等语义。我不这么认为。作为异常类的编写者,您可以决定什么相等语义才有意义。毕竟,当您捕获异常时,您可以在 catch block 中决定捕获哪些异常,通常仅基于类型,但也可以基于其字段的值或其他内容,如我的示例中所示。重点是异常类的相等语义与此无关。

关于scala - 异常应该是案例类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14479732/

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