我必须如何处理数据库和 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();
}
}
}
三个不同的问题
- 通常会有由用户或糟糕的前端编程引起的异常,例如提供无效 ID(实体未找到异常等)
- 然后由于错误代码而出现异常。
- 最后,来自基础架构的异常。
反应
对于错误 #1,您应该通过回复 4xx 错误/状态代码或任何其他视觉反馈给用户,将这些异常回显给前端。
另外两个是程序员或硬件人员必须处理的系统错误。我通常会捕获这些异常,然后将其打包到电子邮件中,并根据异常情况将其发送给支持小组和程序员。如果可能的话,我还会将该错误回显给用户。
例子
- 现在在你的情况下错误 #1 更难实现。
- 错误 #2 的示例是
null
作为参数传递,或者 entity
中的某些内容不喜欢序列化。这些是程序员需要被告知的情况。
- 对于错误 #3,存在“磁盘已满”和“数据库已断开连接”以及其他“hardware-not-available”问题。那些需要去维护组。
策略
- 将这样的默认调用放入您自己的库中
- 为这三种情况创建至少一个(基本)class 自定义例外。在 servlet 上下文中,您还可以使用应返回给前端的 HTTP 状态代码来匹配这些异常。
- 扩展库中的所有调用以检查异常并抛出您的自定义异常之一。
- 在最高级别的执行中可能处理异常。对于 servlet,我有一个
ErrorHandlingServlet extends HttpServlet
并且我的每个 servlet 都使用它,就像您的情况一样,它是 SaveUserServlet extends ErrorHandlingServlet
或类似的东西。 ErrorHandlingServlet
然后在必要时发送一封电子邮件,returns 自定义异常中包含的 HTTP 状态代码。
个人例子
我达到正常 ParameterInvalidException
、ParameterMissingException
、EntityNotFoundException
的深度。
另外,我还有一些非常具体的例外情况,例如 UsernameNotFoundException
(实际上取决于您是否要使用该应用程序的范围),或 InsufficientRightException
(HTTP 401),或 EntityStillAttachedException
.
设施
有很多你可以烹制的东西,你可以决定何时使用以及如何处理它们。
鉴于下面的方法,我应该如何处理可能出现的异常?我想在数据库级别和 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();
}
}
}
三个不同的问题
- 通常会有由用户或糟糕的前端编程引起的异常,例如提供无效 ID(实体未找到异常等)
- 然后由于错误代码而出现异常。
- 最后,来自基础架构的异常。
反应
对于错误 #1,您应该通过回复 4xx 错误/状态代码或任何其他视觉反馈给用户,将这些异常回显给前端。
另外两个是程序员或硬件人员必须处理的系统错误。我通常会捕获这些异常,然后将其打包到电子邮件中,并根据异常情况将其发送给支持小组和程序员。如果可能的话,我还会将该错误回显给用户。
例子
- 现在在你的情况下错误 #1 更难实现。
- 错误 #2 的示例是
null
作为参数传递,或者entity
中的某些内容不喜欢序列化。这些是程序员需要被告知的情况。 - 对于错误 #3,存在“磁盘已满”和“数据库已断开连接”以及其他“hardware-not-available”问题。那些需要去维护组。
策略
- 将这样的默认调用放入您自己的库中
- 为这三种情况创建至少一个(基本)class 自定义例外。在 servlet 上下文中,您还可以使用应返回给前端的 HTTP 状态代码来匹配这些异常。
- 扩展库中的所有调用以检查异常并抛出您的自定义异常之一。
- 在最高级别的执行中可能处理异常。对于 servlet,我有一个
ErrorHandlingServlet extends HttpServlet
并且我的每个 servlet 都使用它,就像您的情况一样,它是SaveUserServlet extends ErrorHandlingServlet
或类似的东西。ErrorHandlingServlet
然后在必要时发送一封电子邮件,returns 自定义异常中包含的 HTTP 状态代码。
个人例子
我达到正常 ParameterInvalidException
、ParameterMissingException
、EntityNotFoundException
的深度。
另外,我还有一些非常具体的例外情况,例如 UsernameNotFoundException
(实际上取决于您是否要使用该应用程序的范围),或 InsufficientRightException
(HTTP 401),或 EntityStillAttachedException
.
设施
有很多你可以烹制的东西,你可以决定何时使用以及如何处理它们。