java - 查找特定的异常和相应的消息

标签 java spring-mvc spring-data

我的 Web 应用程序在 Spring (MVC) 4.2.9.RELEASE、Hibernate 5.1.3.Final、Spring Data 1.8.2.RELEASE 和 MS SQL Server (2014) 上运行。

在 Spring 上下文中,我有以下异常处理程序:

<bean id="simpleMappingExceptionResolver" class="myproject.CustomMappingExceptionResolver">
...
</bean> 

捕获并保存堆栈跟踪。我可以在日志中打印的长堆栈跟踪中深层看到以下内容:

...... 
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
            at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
            ... 113 more
        Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Transaction (Process ID 73) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
            at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:258)
            at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1535)
            at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:467)

如何在上面的异常处理程序中找到以下异常类(并给出一个异常实例):

com.microsoft.sqlserver.jdbc.SQLServerException

相应的消息:

Transaction (Process ID 73) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

最佳答案

如果我理解正确的话,你需要捕获嵌套异常。这有点棘手,但可行。您需要有一个 try-catch block 来处理您期望的顶级异常。在 catch 子句中,您可以使用 exception.getCause() 一次向下一级嵌套,并查看该级别是否是 SQL 异常类的 instance。如有必要,您还可以使用 getMessage() 检查消息。如果异常符合您的标准,那么恭喜您捕获了它。如果没有,只需再次抛出即可。

需要记住两件事:

  • 如果发生许多异常,并且其中只有一小部分真正符合您的条件,则此方法可能会导致性能不佳。
  • 如果异常没有原因,则 e.getCause() 将返回 e 本身。请注意此处的无限递归。

关于java - 查找特定的异常和相应的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49302783/

相关文章:

java - Android响应本地http请求

java - ViewPager - 将数据从 fragment 发送到 Activity 时发生 Android 错误 setCurrentItem(int,boolean)

java - Spring MVC 基于url参数的请求映射

java - 未知标签(形式 :option) error

java - Spring 数据 : findByEntityNot() in a many to many relationship

java - 为什么要加载WebMvcConfigurer?

java - HashMap 迭代复杂度

java - 当涉及内部类时,Java 继承如何工作

javascript - Handsontable粘贴不起作用

kotlin - Page 类的 graphql 架构定义应该是什么样子?