当前位置: 首页 > 知识库问答 >
问题:

暴露静态编程语言的异常处理-如何捕获唯一的约束违反异常?

席兴平
2023-03-14

我在表中的列上添加了唯一约束。当违反约束时,它会抛出一个我无法捕获并传达给用户的异常。

<代码>公开:事务尝试#0失败:java。sql。BatchUpdateException:Batch entry 0 INSERT INTO templates(created\u at,is\u deleted,name,sections)值('2018-10-03 16:31:25.732 05:30','FALSE','Template1','[{“title”:“Introduction”}]')返回*已中止:错误:重复键值违反唯一约束“templates\u name\u key”详细信息:key(name)=(Template1)已存在。调用getNextException查看批处理中的其他错误。。语句:插入到模板(创建于、删除于、名称、节)值(?、、?、?)!组织。postgresql。util。PSQLException:错误:重复的键值违反了唯一约束“templates\u name\u key”!详细信息:键(名称)=(Template1)已存在

  • 如何使用用户可读的消息捕获此类SQL异常

下面是我尝试的片段。

return try {
    val template: TemplateSerializer = transaction {
        val newTemplate = Template.insert(request)
        TemplateSerializer.serialize(newTemplate)
    }
    Response.status(201).entity(template).build()
} catch (e: Exception) {
    if(e is SQLIntegrityConstraintViolationException) {
        resourceLogger.error("SQL constraint violated")
    } else if(e is BatchUpdateException) {
        resourceLogger.error("SQL constraint violated")
    } else
        resourceLogger.error(e.message)
    Response.status(422).entity(mapOf("error" to true, "message" to "Insertion failed")).build()
}

根本不会打印违反SQL约束的消息。也尝试了使用不同异常类的多个捕获。什么都没用。

发送这样的通用错误消息没有帮助。

共有2个答案

佴波鸿
2023-03-14

您可以检查sqlState

它看起来像:

try {
        userService.insertUser(user)
    } catch (e: ExposedSQLException) {

        val isUniqueConstraintError = e.sqlState == "23505"
    }

您可以从这里获取正确的错误代码:

https://www.postgresql.org/docs/10/errcodes-appendix.html

常子濯
2023-03-14

Exposed抛出ExposedSQLException,它是SQLException的子类型,可以通过函数访问最新执行的查询(可能导致原始异常)。原始异常可通过属性访问。

return try {
    val template: TemplateSerializer = transaction {
        val newTemplate = Template.insert(request)
        TemplateSerializer.serialize(newTemplate)
    }
    Response.status(201).entity(template).build()
} catch (e: Exception) {
    val original = (e as? ExposedSQLException)?.cause
    when (original) {
      is SQLIntegrityConstraintViolationException -> 
        resourceLogger.error("SQL constraint violated")
      is BatchUpdateException -> 
        resourceLogger.error("SQL constraint violated")
      else ->
        resourceLogger.error(e.message)
    }
Response.status(422).entity(mapOf("error" to true, "message" to "Insertion failed")).build()
 类似资料:
  • 我想知道为什么在下面的代码中没有捕捉到异常: 函数的调用方式如下: 但我还是遇到了一个导致应用程序崩溃的异常: 我想说try/catch块会捕获异常,但唉。。。 什么原因导致异常没有被捕获?我想说线程并不重要,因为我使用try/get块来处理线程中的异常。 在Laalto的回答之后,我更新了代码,如下所示(对于那些感兴趣的人):

  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 我已经研究了许多其他关于不捕捉异常的问题(包括不能捕捉约束违反异常),但没有一个问题和我一样。 使用RestEasy联网和Hibernate链接Postgres db。 我有一个目标: db服务通过OutcomResource.save输出发送一个输出: 然后由OutcomRepository.save保存在db中: 当为用户发布并保存第一个结果时,它成功地保存在数据库中。如果发布了第二个结果,则

  • 基于Spring Data(JPA/Hibernate)的应用程序在Postgres中持久化新实体时会增加负载,出现以下异常:org.postgresql.util.PSQLException:错误:重复键值违反唯一约束“hibernate_sequences_pkey” id的策略定义如下: 我知道这种策略对Postgres来说并不是完美的解决方案,然而这是上述例外的原因吗? 负载是使用Apac

  • 代码: 崩溃仍然被抛出。见下文: 2019-02-20 19:45:22.514 22435-22435/com.xxx。xxx E/PedalApp:无法保存层java.lang.RuntimeException:停止失败。在android.media.MediaRecorder。在com.androidchekhov.looperpedal.PedalActivity$onCreate$6.i