如何循环访问异常 getCause() 以查找具有详细信息消息的根本原因

2022-08-31 12:05:09

我正在尝试在休眠状态中调用以保存数据。由于列具有唯一的索引,因此当我通过Eclipse调试器查看时,它会抛出。saveOrUpdate()ConstraintViolationException

因为在向表中插入数据时,对于不同的异常,根本原因可能不同。
我想知道,我如何循环/遍历以检查异常及其消息的根本原因是什么。getCause()

更新:
感谢大家的善意回应,问题是我想要输出如下图所示:
enter image description here
我需要访问demomentMessage字段。
(我真的很抱歉,如果不能让我的问题更清楚。

谢谢。


答案 1

Apache ExceptionUtils 提供以下方法:

Throwable getRootCause(Throwable throwable) 

以及

String getRootCauseMessage(Throwable th) 

答案 2

我通常使用下面的实现而不是Apache的实现。

除了复杂性之外,Apache的实现在未找到原因时返回null,这迫使我对null执行额外的检查。

通常,在寻找异常的根本/原因时,我已经有一个非空异常开始,如果找不到更深层次的原因,那么对于所有预期的建议都是手头失败的原因。

Throwable getCause(Throwable e) {
    Throwable cause = null; 
    Throwable result = e;

    while(null != (cause = result.getCause())  && (result != cause) ) {
        result = cause;
    }
    return result;
}