Scala slick 我怎么能 return 我自己的错误信息
Scala slick how can I return my own Error message
我有一个要求用户电子邮件的注册操作,在我的 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.)**
我想 return 我自己的通用错误消息,类似于他们在这里做的事情 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 对应于重复的电子邮件,那么我可以向用户提供通用消息,例如 "Duplicate Email" 。任何建议都会很棒,因为我是 Scala 和 Slick 的新手。我正在使用 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}")
}
}
考虑到我正确理解了你的问题,你可以使用嵌套大小写。
在机箱内检查错误代码,如果错误代码符合预期,则显示 Msg.
case Failure(e: PSQLException) => e.code match{
case "23008" => println("Duplicate email")
case - => println("Some generic msg")
}
如果我理解有误,请告诉我。
错误信息
constructor cannot be instantiated to expected type;
found : akka.actor.FSM.Failure
required: scala.util.Try[Int]
似乎表明您指的是错误的故障类型。它不是 Try 的子类型,而是来自 akka 的子类型。
也许检查你的进口?
- 使用 .recoverWith { case _: OwnException()}
- 或者 .recover 也可以。
https://github.com/scala/scala/blob/2.13.x/src/library/scala/concurrent/Future.scala
我有一个要求用户电子邮件的注册操作,在我的 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.)**
我想 return 我自己的通用错误消息,类似于他们在这里做的事情 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 对应于重复的电子邮件,那么我可以向用户提供通用消息,例如 "Duplicate Email" 。任何建议都会很棒,因为我是 Scala 和 Slick 的新手。我正在使用 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}")
}
}
考虑到我正确理解了你的问题,你可以使用嵌套大小写。 在机箱内检查错误代码,如果错误代码符合预期,则显示 Msg.
case Failure(e: PSQLException) => e.code match{
case "23008" => println("Duplicate email")
case - => println("Some generic msg")
}
如果我理解有误,请告诉我。
错误信息
constructor cannot be instantiated to expected type;
found : akka.actor.FSM.Failure
required: scala.util.Try[Int]
似乎表明您指的是错误的故障类型。它不是 Try 的子类型,而是来自 akka 的子类型。
也许检查你的进口?
- 使用 .recoverWith { case _: OwnException()}
- 或者 .recover 也可以。
https://github.com/scala/scala/blob/2.13.x/src/library/scala/concurrent/Future.scala