Scala slick如何返回我自己的错误消息

时间:2016-05-29 20:51:56

标签: scala playframework slick slick-3.0

我有一个请求用户电子邮件的注册操作,在我的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}")

          }
        }

3 个答案:

答案 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)

  • 使用.recoverWith {case _:OwnException()}
  • 或者.recover也可以。

https://github.com/scala/scala/blob/2.13.x/src/library/scala/concurrent/Future.scala