Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何改进“代码”;嵌套尝试。。匹配;?_Scala_Try Catch - Fatal编程技术网

Scala 如何改进“代码”;嵌套尝试。。匹配;?

Scala 如何改进“代码”;嵌套尝试。。匹配;?,scala,try-catch,Scala,Try Catch,在我的scala代码中,有一些嵌套的Try()match{},看起来很难看: import scala.util._ Try(convertJsonToObject[User]) match { case Success(userJsonObj) => Try(saveToDb(userJsonObj.id)) match { case Success(user) => Created("User saved") case _ => Int

在我的scala代码中,有一些嵌套的
Try()match{}
,看起来很难看:

import scala.util._

Try(convertJsonToObject[User]) match {
  case Success(userJsonObj) =>
    Try(saveToDb(userJsonObj.id)) match {
      case Success(user) => Created("User saved")
      case _ => InternalServerError("database error")
    }
  case _ => BadRequest("bad input")
}

有没有更好的方法来编写这样的代码?

有很多方法可以解决这个问题。我给你一个可能性。考虑代码的清理版本:

trait Result
case class BadRequest(message:String) extends Result
case class InternalServerError(message:String) extends Result
case class Created(message:String) extends Result

def processRequest(json:String):Result = {
  val result = 
    for{
      user <- Try(parseJson(json))
      savedUser <- Try(saveToDb(user))
    } yield Created("saved")

  result.recover{
    case jp:JsonParsingException => BadRequest(jp.getMessage)
    case other => InternalServerError(other.getMessage)
  }.get
}

def parseJson(json:String):User = ...
def saveToDb(user:User):User = ...
然后在控制器中:

import ExceptionHandling._
result.recover(StandardRecovery).get

另一种方法是为用户定义隐式(如果使用Play框架),然后执行以下操作

someData.validate[User].map{User=>
saveToDb(user.id)匹配{//您可以从saveToDb返回Try
案例成功(savedUser)=>已创建(“用户已保存”)
案例失败(异常)=>InternalServerError(“数据库错误”)
}
}.收回总额{
e=>BadRequest(JsError.toFlatJson(e))
}    

我最近编写了类似的代码。我发现这很有帮助。由于代码没有处理
故障
s中的可丢弃信息,您可以将这些
Try
s转换为
选项
s。一个“简单”的修复方法是将内部的
Try
放入它自己的函数中。
import ExceptionHandling._
result.recover(StandardRecovery).get
Try(convertJsonToObject[User]).map([your code]).toOption.getOrElse(fallback)