Scala 如何改进“代码”;嵌套尝试。。匹配;?
在我的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
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)