如何通过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; }