如何通过Exception getCause()循环查找详细消息的根本原因

我正在尝试在hibernate中调用saveOrUpdate()来保存数据。 由于列具有唯一索引,所以当我通过Eclipsedebugging器查看时,它会抛出ConstraintViolationException

由于在向表中插入数据时,根源可能会因不同的例外而有所不同。
我想知道,如何循环/遍历getCause()来检查exception及其消息的根本原因。

更新:
感谢大家的友善回应,事情是我想输出像下面的图像:
在这里输入图像说明
我需要访问detailMessage字段。
(我真的很抱歉如果不能让我的问题更清楚。)

谢谢。

Apache ExceptionUtils提供了以下方法:

 Throwable getRootCause(Throwable throwable) 

以及

 String getRootCauseMessage(Throwable th) 

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

除了复杂性,Apache的实现在没有find原因的情况下返回null,这迫使我对null执行额外的检查。

通常,当查找exception的根/原因时,我已经有了一个非空的exception开始,这是所有打算提出的是失败的原因,如果无法find更深的原因。

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

你在问这样的事吗?

 Throwable cause = originalException; while(cause.getCause() != null) { cause = cause.getCause(); } 

还是我错过了什么?

使用java 8 Stream API,可以通过以下方式实现:

 Optional<Throwable> rootCause = Stream.iterate(exception, Throwable::getCause).filter(element -> element.getCause() == null).findFirst(); 

请注意,这段代码对exception原因循环不是免疫的,因此应该在生产中避免。

番石榴的Throwables提供以下方法:

 Throwable getRootCause(Throwable throwable) 

以及

 String getStackTraceAsString(Throwable throwable) 
 } catch (Exception ex) { while (ex.getCause() != null) ex = ex.getCause(); System.out.println("Root cause is " + ex.getMessage()); } 

你是否期待更复杂的东西?

在APACHE ; 执行如下。

突出显示是list.contains(throwable)== false

 public static Throwable getRootCause(final Throwable throwable) { final List<Throwable> list = getThrowableList(throwable); return list.size() < 2 ? null : (Throwable)list.get(list.size() - 1); } public static List<Throwable> getThrowableList(Throwable throwable) { final List<Throwable> list = new ArrayList<Throwable>(); while (throwable != null && list.contains(throwable) == false) { list.add(throwable); throwable = ExceptionUtils.getCause(throwable); } return list; }