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

Spring ExceptionHandler的原因/包装异常

仰英发
2023-03-14

我找不到一个好的解决方案:在我的Spring Boot应用程序中,作为一个@ExceptionHandler方法,我需要定义一个处理程序,不是针对特定的异常,而是针对由特定异常(即包装异常)引起的任何异常。

例句:有时候我会这样:

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Error while committing the transaction
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:541) ~[spring-orm-5.1.4.RELEASE.jar:5.1.4.RELEASE]
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746) ~[spring-tx-5.1.4.RELEASE.jar:5.1.4.RELEASE]    
    ... 121 common frames omitted
Caused by: custom.TechRoleException: My custom TechRoleException
    at myapp.method1[..]
    at myapp.methodOuter[..]

我的自定义TechRoleExc0019是我在一些Hibernate EventListener的预更新方法中抛出的异常,直接异常是无法发生持久性。

但是,以下尝试使用我的自定义异常的方法从未达到:

@ControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(TechRoleException.class)
  public String techRoleException(HttpServletRequest request, Exception ex) {
    System.out.println("Got here");
    return "home";
  }
}

这里有一个类似的线程,答案是错误的,但没有回答这个问题:@ExceptionHandler for Wrapped Exception/getCause()在Spring中

共有2个答案

端木骞尧
2023-03-14

我的最后一个工作答案是处理一个常规异常,然后使用ApacheExceptionUtils。getRootCause()来检测我在此常规处理程序中查找的特定原因。

(如果其他特定的异常具有专用处理程序,则不会出现在此方法中。但是,如果没有专用处理程序,则异常将出现在此处。)这是检测某些目标的唯一方法。

@ExceptionHandler(Exception.class)
public String handleGeneralException(HttpServletRequest request, Exception ex) {

    Throwable rootCause = ExceptionUtils.getRootCause(ex);
    if (rootCause != null && "com.myapp.TechRoleException".equals(rootCause.getClass().getName())
    {       
        //... handle this Caused-By Exception here
        // ...
    }
    // All other exceptions that don't have dedicated handlers can also be handled below...
    // ...

}
谷梁宏恺
2023-03-14

也许是那样的?

@ExceptionHandler(Exception.class)
public String techRoleException(HttpServletRequest request, Exception ex) {
if(ex instanceof TechRoleException) {
    System.out.println("Got here");
    return "home";
} else {
    throw ex; //or something else
}
}
 类似资料:
  • 有人知道使用包装异常的最佳/最简单方法吗? 我有一个自定义的,用于转换,如果输入超出标准范围,则会引发自定义运行时异常。 这最终被Spring包装在一个中,我可以在我的控制器建议中使用来处理。 但是我必须并使用确定底层异常是否是我感兴趣的类型。此时,我可以使用对但是如果我有一个不同的底层异常,我不知道该怎么办? 如果我重新引发原始异常,我会收到一条令人讨厌的日志消息“调用@ExceptionHan

  • 问题内容: 我的logcat中出现这种错误。尽管出现此错误,但我的项目运行正常。所以我只想澄清有关此错误的这些内容: 问题答案: 我认为当您已经安装了以前的版本并从eclipse运行应用程序时会发生这种情况?如果您在从Eclipse重新运行之前卸载了该应用程序,则不会发生这种情况。另外,这不会造成任何问题。

  • 问题内容: 尽管存在SQL的ANSI标准,但为什么SQL发行版是如此非标准?SQL数据库的工作方式确实存在许多有意义的差异,还是我一直在使用的两个数据库:MS- SQL和PostgreSQL?为什么会出现这些差异? 问题答案: 这是“隐身锁定”的一种形式。乔尔在这里详细介绍: http://www.joelonsoftware.com/articles/fog0000000056.html htt

  • 我正在使用寻呼机适配器来显示视图寻呼机中的图像,这将在异步任务中由bitmap工厂下载。 pageradapter类: 我的日志: 02-08 18:49:22.55418345-18345/奥托涅。dg10 E/AndroidRuntime:致命异常:主java。autogenie上的lang.NullPointerException。dg10。pageradapter$LoadImage。au

  • 问题内容: 是什么导致此异常,我无法找出原因。 根本原因: 码: 我在构造函数中初始化标签: 编辑 登录setter方法时出现异常: 问题答案: 我的猜测是,Hibernate使用自己的Set实现(PersistentSet)来调用您的setter,该实现实现了延迟加载,并且在调用setter时尚未初始化。由于您在此集合上调用了一个方法,因此它已经使集合在加载阶段本身​​处于加载阶段,这使Hibe

  • 问题内容: 我可以看到捕获了一个可以打印的异常,尽管这种异常一直存在。 我是否需要将其设置在某个地方,或者缺少将原因设置为null的东西? 问题答案: 一个例外的属性和。该消息是一种描述,或多或少准确地告诉人类读者出了什么问题。的是不同的东西:它是,如果有的话,另一个(嵌套)。 如果我们使用这样的自定义异常,通常会使用该概念: 编辑-响应@djangofans评论。 标准是嵌套表达式(原因)也将与