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