如果例外情况是案例类?
我的自定义exceptiontypes应该是case class
?
好的一面,我得到提取器。
在负面,我得到不正确的平等语义。 但是我可以通过压倒equals
来避免这种情况。
那么在概念层面上,让它们成为case class
是有意义的吗?
这当然是非常主观的,但在我看来,把exception类作为案例类是一个很好的做法。 主要的基本原理是,当你捕获一个exception时,你正在做模式匹配,并且case类在模式匹配中使用得更好。 下面是一个例子,在使用case类exception时,可以利用catch模块中全部模式匹配的function:
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 + ")") }
在这个例子中,我们只有一个例外,但它包含一个errorType
字段,当你想知道发生的确切的错误types(通常这是通过exception的层次结构模型,我不是说这是好还是坏,这个例子只是说明)。 因为IOError
是一个case类,所以我可以简单地通过case IOError( msg, IOErrorType.FileNotFound )
来处理case IOError( msg, IOErrorType.FileNotFound )
types的IOErrorType.FileNotFound
。 如果没有我们通过case类免费获得的提取器,我将不得不每次都捕获这个exception,然后在我实际上并不感兴趣的情况下进行反转,这是非常详细的。
你说案例类给你不正确的平等语义。 我不这么认为。 作为exception类的作者, 你可以决定什么样的平等语义是有意义的。 毕竟,当你捕捉到一个exception时,catch块就是你决定通常只根据types来捕获哪些exception,但是可以根据它的字段的值或者任何其他的值,如我的例子。 关键是,exception类的平等语义与此无关。
通过创buildexception情况类而丢失的一个常见成语是创build具有子类的exception子类层次结构的模式,用于指示错误情况的更具体的特征。 案例类不能被分类。
我喜欢RégisJean-Gilles的回答。 但是,如果你有充分的理由不作案例(见戴夫·格里菲斯的答案),你可以像上面的例子一样使用正常的类和不应用:
object IOErrorType extends Enumeration { val FileNotFound, DeviceError, LockedFile = Value } object IOError { def unapply(err: IOError): Option[(String, IOErrorType.Value)] = Some(err.message, err.errorType) } class IOError(val message: String, val errorType: IOErrorType.Value) extends Exception(message) def doSomeIO() { throw new IOError("Oops, file not found!", IOErrorType.FileNotFound) } try { doSomeIO() } catch { case IOError( msg, IOErrorType.FileNotFound ) => println("File not found, please check the path! (" + msg + ")") }