我的 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/