使用此代码,只会对指定的异常执行println。我想知道是否有可能使该行取反以使其对所有未指定的其他异常执行。我知道可以使用2种情况,但是我想知道是否可以用一种情况来完成。
val myHandler: PartialFunction[Throwable, Unit] = {
case e @ (_: MappingException | _: ParseException | _: SomeOtherException) =>
println("Got it")
}
好了,您已经确定什么可能是更易读的方法。
val myHandler: PartialFunction[Throwable, Unit] = {
case e @ (_: MappingException | _: ParseException | _: SomeOtherException) =>
throw e
case _ =>
println("Got it")
}
这可能就是我在实际生产代码中写的方式。这很明智,一目了然。
但是您要求一个案例,所以让我们开始吧。由于我们要检查几种类型,因此我们需要能够将它们表示为列表。有无数的Scala库可以使它更漂亮,但是出于我们的目的,我们只会推出自己的库。
trait TList {
def isMember(x: Any): Boolean
}
object Nil extends TList {
def isMember(x: Any) = false
}
case class Cons[H : ClassTag](val tail: TList) extends TList {
def isMember(x: Any) = {
x match {
case _: H => true
case _ => tail.isMember(x)
}
}
}
因此,我们可以表示经典的Lisp样式单链接列表,并检查Any
列表中任何位置的任意值是否具有类型。现在让我们取反并编写一个unapply
方法。
case class NotMember(val types: TList) {
def unapply(elem: Any): Boolean =
!types.isMember(elem)
}
然后我们的处理程序看起来像
val test = NotMember(
Cons[MappingException](Cons[ParseException](Cons[SomeOtherException](Nil)))
)
val myHandler: PartialFunction[Throwable, Unit] = {
case test() =>
println("Got it")
}
同样,如果您确实想走这条路,那么您将需要获取一个库以使类型级的东西易于管理。但这绝对是可能的。唯一的问题是,在您的用例中是否值得?
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句