我在spray-json中覆盖了一个方法,以便捕获它抛出的异常。在一个特殊情况下,我想添加特殊处理,但我想重新抛出原始异常。
但例外情况并非重新抛出。
object MyObject extends DefaultJsonProtocol {
override def fromField[T](value: JsValue, fieldName: String)(implicit reader: JsonReader[T]) = {
try {
super.fromField(value, fieldName)(reader)
} catch {
case e: DeserializationException =>
if (reader.isInstanceOf[SafeListFormat[_]]) EmptyList.asInstanceOf[T]
else deserializationError("Object is missing required member '" + fieldName + "'", e)
}
}
}
spray-json中的deserializationError:https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/package.scala
我在此处覆盖的方法是fromField
:https://github.com/spray/spray-json/blob/master/src/main/scala/spray/json/ProductFormats.scala
在调试模式下,我可以看到原始异常被捕获,我的else
情况"重新抛出"错误,甚至在spray-json的库中调用deserializationError方法。但即使通过DeserializationException是一个RuntimeException,重写的方法也不会终止。
我想知道是否有关于deserializationError方法的延迟执行的事情。但我甚至尝试将我的异常处理程序从调用deserializationError更改为简单的throw e
,并且它也没有用。
这里发生了什么?
PS。我不认为这是特定于spray-json的,但可能是我对scala不了解的一些有趣内容。但是我将这个例子保留为一个真实的世界,以防万一它与我的重写方法被spray-json库代码调用的方式特别相关。
编辑:使用喷涂用户论坛提出同样的问题:https://groups.google.com/forum/#!topic/spray-user/YXtY6VyIVGk
答案 0 :(得分:0)
说实话,我似乎没问题。所以这里有一些随机的观察(太长时间不作为评论):
super.fromField[T]
,现在您没有通过T
参数。当事情很奇怪时,尽量使一切都明确。 您可以尝试功能错误处理:
Try(super.fromField(value, fieldName)(reader)).recover {
case e: DeserializationException if (reader.isInstanceOf[SafeListFormat[_]]) => EmptyList.asInstanceOf[T]
case t: Exception => throw t
}.get
请注意我是如何使模式的if部分匹配的,这样做可能会帮助您隔离问题。
祝你好运!