作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的表在我的 postgresql 数据库中的一对列上有一个唯一索引。
我想知道如何在插入时捕获重复的键异常:
def save(user: User)(implicit session: Session): User = {
val newId = (users returning users.map(_id) += user
user.copy(id = newId)
}
Execution exception[[PSQLException: ERROR: duplicate key value violates unique constraint "...."
最佳答案
您的 save
方法可能应该返回与 User
不同的东西, 表示失败的可能性。如果唯一会抛出的异常是唯一键,并且您真的只关心成功或失败(而不是失败的类型),那么一种方法是返回 Option[User]
.
你可以使用一个简单的 try/catch
块,映射成功保存到 Some[User]
和 PSQLException
至 None
:
def save(user: User)(implicit session: Session): Option[User] = {
try {
val newId = (users returning users.map(_id) += user
Some(user.copy(id = newId))
} catch {
case PSQLException => None
}
}
try/catch
不是真正惯用的 Scala,并且您的错误类型被丢弃。下一个选项是使用
scala.util.Try
.
def save(user: User)(implicit session: Session): Try[User] = Try {
val newId = (users returning users.map(_id) += user
user.copy(id = newId)
}
Try
的正文成功,则
save
将返回
Success[User]
,否则将返回包裹在
Failure
中的异常.这将允许您使用
Try
做很多事情。 .
save(user) match {
case Success(user) => Ok(user)
case Failure(t: PSQLException) if(e.getSQLState == "23505") => InternalServerError("Some sort of unique key violation..")
case Failure(t: PSQLException) => InternalServerError("Some sort of psql error..")
case Failure(_) => InternalServerError("Something else happened.. it was bad..")
}
Option
一样使用它:
save(user) map { user =>
Ok(user)
} getOrElse {
InternalServerError("Something terrible happened..")
}
(for {
u1 <- save(user1)
u2 <- save(user2)
u3 <- save(user3)
} yield {
(u1, u2, u3)
}) match {
case Success((u1, u2, u3)) => Ok(...)
case Failure(...) => ...
}
关于scala - 如何捕获重复键值违规的光滑 postgres 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080868/
我是一名优秀的程序员,十分优秀!