Java JdbcTemplate.execute()方法可以引发的所有异常

Java JdbcTemplate.execute()方法可以引发的所有异常,java,spring,exception,spring-jdbc,Java,Spring,Exception,Spring Jdbc,如何找出JdbcTemplate.execute()method调用可以引发哪些异常。我知道它会抛出DataAccessException。但是由于DataAccessException是抛出的实际异常的父类,这就成为了一个非常宽泛的语句 例如,它抛出子类BadSqlGrammarException。我知道我可以在源代码中找到它,但我想知道是否有一个列表或某种方法可以找到它,再加上从源代码推断可能会导致问题。原因是捕捉异常,以便我可以记录它们并适当地通知用户。那么,我如何确切地找出抛出了哪些异常

如何找出
JdbcTemplate.execute()
method调用可以引发哪些异常。我知道它会抛出
DataAccessException
。但是由于
DataAccessException
是抛出的实际异常的父类,这就成为了一个非常宽泛的语句


例如,它抛出子类
BadSqlGrammarException
。我知道我可以在源代码中找到它,但我想知道是否有一个列表或某种方法可以找到它,再加上从源代码推断可能会导致问题。原因是捕捉异常,以便我可以记录它们并适当地通知用户。那么,我如何确切地找出抛出了哪些异常呢?我应该这样做还是捕获DataAccessException并记录其消息就足够了?

您可以捕获父异常并使用原始代码或某个实用程序库来找到异常的根本原因。 下面的原始代码示例,从catch块调用。 应始终记录异常和消息的根本原因。通常有一个集中的公共异常处理程序,只在一个地方记录异常(例如在Spring应用程序中,我们使用@ControllerAdvice

private static Throwable findSpecificCause(Throwable throwable) {
        Throwable rootCause = getRootCause(throwable);
        return (rootCause != null ? rootCause : throwable);
    }

private static Throwable getRootCause(Throwable throwable) {
        if (throwable == null) {
            return null;
        }
        Throwable rootCause = null;
        Throwable cause = throwable.getCause();
        while (cause != null && cause != rootCause) {
            rootCause = cause;
            cause = cause.getCause();
        }
        return rootCause;
    }

您还可以考虑使用Apache的普通lang ExceptionUtils、Spring NestStestExpUTILLS或Guava

等库。
另请参阅链接:

“从源代码推断可能会导致问题”如何?源代码不是最好的参考吗?如果我有权访问它,它将是我首先要看的地方。其他选项包括寻找javadoc或其他文档,编写模拟可能错误的测试用例,以及查看stacktraces。我指的问题不是灾难性的,但我可能认为我已经涵盖了所有这些这类问题。我看过Spring API文档,但它只说明了
DataAccessException
。它显示了层次结构,但我无法确切知道引发了哪些异常。可能有一个异常位于
DataAccessException
下,但不是由
execute引发的()
。感谢您提供有关异常处理库的建议,老实说,我不知道它们。我尝试了您的建议,到目前为止,我认为这正是我想要的。此外,我知道@ControllerAdvice,但是,到目前为止,我还没有使用
控制器。