在Scala中返回None而不是Option会产生编译错误

时间:2013-01-17 17:33:58

标签: scala playframework-2.0

这是一个我无法弄清楚的简单问题:

以下代码给出了以下编译错误:

def parseJson(q: String) = Option[JsValue]{
    try{
            Json.parse(q)
    }catch{
        case e: com.codahale.jerkson.ParsingException => None
    }
}

错误

[error]  found   : None.type (with underlying type object None)
[error]  required: play.api.libs.json.JsValue
[error]             case e: com.codahale.jerkson.ParsingException => None

为什么我不能返回没有考虑我的响应类型是Option [JsValue]?

2 个答案:

答案 0 :(得分:10)

你实际上想把Json.parse(q)放到Some()中,而不是将整个代码包装在一个Option [JsValue]中,而是用它作为签名:

def parseJson(q: String): Option[JsValue] = {
    try{
       Some(Json.parse(q))
    }catch{
       case e: com.codahale.jerkson.ParsingException => None
    }
}

但无论如何你应该更喜欢使用scala.util.control.Exception

 import scala.util.control.Exception._
 catching(classOf[com.codahale.jerkson.ParsingException]).opt(Json.parse(q))

答案 1 :(得分:1)

我认为你刚刚弄错了方法定义的语法。您编写它的方式是在try / catch块的结果上调用Option.apply。我想你打算写这个:

def parseJson(q: String): Option[JsValue] = {
  try {
    Some(Json.parse(q))
  } catch {
    case e: com.codahale.jerkson.ParsingException => None
  }
}