我有一个请求用户电子邮件的注册操作,在我的postgres数据库中我只允许使用唯一的电子邮件。当我输入重复的电子邮件时,我会收到错误消息
**Failure(org.postgresql.util.PSQLException: ERROR: duplicate key value violates
unique constraint "same_name_profiles_email"
Detail: Key (email)=(gtff@gmail.com) already exists.)**
我想返回我自己的通用错误消息,类似于他们在此处所做的事情How to catch slick postgres exceptions for duplicate key value violations。 我面临的问题是我收到错误
**constructor cannot be instantiated to expected type;
found : akka.actor.FSM.Failure
required: scala.util.Try[Int]**
我想要做的是显示错误消息代码和sqlState代码。这是我的代码
def registration = Action.async {implicit request=>
val setup =
sqlu"""INSERT Logic"""
db.run(setup.asTry).map { result =>
if(result.isFailure)
{
result match {
case Failure(e: PSQLException) => {
//code: if Error I would like to return message below
Ok(s"PostgresIntegrityConstraintViolationException, code: ${e.getErrorCode}, sql status: ${e.getSQLState}, message: ${e.getMessage}")
}
}
}
Ok(result.toString())
}
}
每当数据库中出现错误时,它就属于 result.isFailure ,现在我只想获得PSQLException ErrorCode和SQLState。我真的不关心匹配或任何事情。我这样做是为了一个Web服务API,所以如果我看到错误代码23008对应重复的电子邮件,那么我可以给用户一个通用的消息,如“重复电子邮件”。任何建议都会很棒,因为我是Scala和Slick的新手。我正在使用光滑的版本3.11
错误讯息来自此部分
result match {
case Failure(e: PSQLException) => {
//code: if Error I would like to return message below
Ok(s"PostgresIntegrityConstraintViolationException, code: ${e.getErrorCode}, sql status: ${e.getSQLState}, message: ${e.getMessage}")
}
}
答案 0 :(得分:2)
考虑到我理解你的问题,你可以使用嵌套的Case。 在案例内部检查错误代码,如果错误代码符合预期,则显示消息。
case Failure(e: PSQLException) => e.code match{
case "23008" => println("Duplicate email")
case - => println("Some generic msg")
}
如果我理解错误,请告诉我。
答案 1 :(得分:1)
错误消息
constructor cannot be instantiated to expected type;
found : akka.actor.FSM.Failure
required: scala.util.Try[Int]
似乎表明你指的是错误的失败类型。它不是Try的子类型,而是来自akka的子类型。
也许检查你的进口商品?
答案 2 :(得分:0)
https://github.com/scala/scala/blob/2.13.x/src/library/scala/concurrent/Future.scala