我必须如何处理数据库和 JPA 异常?

How must I handle database and JPA exceptions?

鉴于下面的方法,我应该如何处理可能出现的异常?我想在数据库级别和 JPA 级别提供反馈。当抛出约束冲突时,我想知道在哪个字段上。您将如何处理此方法的异常?

public static <T> void persist(T entity) {
    try {
        em.getTransaction().begin();
        em.persist(entity);
        em.getTransaction().commit();
    } finally {
        if (em.getTransaction().isActive()) {
            em.getTransaction().rollback();
        }
    }
}

三个不同的问题

  1. 通常会有由用户或糟糕的前端编程引起的异常,例如提供无效 ID(实体未找到异常等)
  2. 然后由于错误代码而出现异常。
  3. 最后,来自基础架构的异常。

反应

对于错误 #1,您应该通过回复 4xx 错误/状态代码或任何其他视觉反馈给用户,将这些异常回显给前端。

另外两个是程序员或硬件人员必须处理的系统错误。我通常会捕获这些异常,然后将其打包到电子邮件中,并根据异常情况将其发送给支持小组和程序员。如果可能的话,我还会将该错误回显给用户。

例子

  1. 现在在你的情况下错误 #1 更难实现。
  2. 错误 #2 的示例是 null 作为参数传递,或者 entity 中的某些内容不喜欢序列化。这些是程序员需要被告知的情况。
  3. 对于错误 #3,存在“磁盘已满”和“数据库已断开连接”以及其他“hardware-not-available”问题。那些需要去维护组。

策略

  1. 将这样的默认调用放入您自己的库中
  2. 为这三种情况创建至少一个(基本)class 自定义例外。在 servlet 上下文中,您还可以使用应返回给前端的 HTTP 状态代码来匹配这些异常。
  3. 扩展库中的所有调用以检查异常并抛出您的自定义异常之一。
  4. 在最高级别的执行中可能处理异常。对于 servlet,我有一个 ErrorHandlingServlet extends HttpServlet 并且我的每个 servlet 都使用它,就像您的情况一样,它是 SaveUserServlet extends ErrorHandlingServlet 或类似的东西。 ErrorHandlingServlet 然后在必要时发送一封电子邮件,returns 自定义异常中包含的 HTTP 状态代码。

个人例子

我达到正常 ParameterInvalidExceptionParameterMissingExceptionEntityNotFoundException 的深度。 另外,我还有一些非常具体的例外情况,例如 UsernameNotFoundException(实际上取决于您是否要使用该应用程序的范围),或 InsufficientRightException (HTTP 401),或 EntityStillAttachedException.

设施

有很多你可以烹制的东西,你可以决定何时使用以及如何处理它们。