覆盖方法中的重新例外但不重新抛出

时间:2015-11-05 12:29:55

标签: scala spray-json

我在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

我在此处覆盖的方法是fromFieldhttps://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

1 个答案:

答案 0 :(得分:0)

说实话,我似乎没问题。所以这里有一些随机的观察(太长时间不作为评论):

  1. 致电super.fromField[T],现在您没有通过T参数。当事情很奇怪时,尽量使一切都明确。
  2. 您可以尝试功能错误处理:

    Try(super.fromField(value, fieldName)(reader)).recover {  
      case e: DeserializationException if (reader.isInstanceOf[SafeListFormat[_]]) => EmptyList.asInstanceOf[T]
      case t: Exception => throw t
    }.get
    
  3. 请注意我是如何使模式的if部分匹配的,这样做可能会帮助您隔离问题。

  4. 我觉得你的方法没有终止是很奇怪的。你可能应该尝试将示例简化为非常简单的事情,并开始逐渐增加复杂性并查看它的中断位置。
  5. 祝你好运!