1

これは私が理解できない簡単な質問です:

次のコードは、次のコンパイルエラーを示します。

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]であるにもかかわらず、Noneを返すことができないのはなぜですか?

4

2 に答える 2

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))
于 2013-01-17T17:44:48.730 に答える
1

メソッド定義の構文が間違っていると思います。あなたがそれを書いた方法Option.applyでは、try/catchブロックの結果を呼び出しています。私はあなたがこれを書くつもりだったと思います:

def parseJson(q: String): Option[JsValue] = {
  try {
    Some(Json.parse(q))
  } catch {
    case e: com.codahale.jerkson.ParsingException => None
  }
}
于 2013-01-17T17:41:02.907 に答える