Java 从Throwable获取根错误消息
我正在做一个web项目的错误处理,我遇到了一个案例,在这个案例中,我向用户显示的错误并没有特别的帮助。我一直在使用它来获取错误消息,以便向我的用户显示:Java 从Throwable获取根错误消息,java,exception-handling,Java,Exception Handling,我正在做一个web项目的错误处理,我遇到了一个案例,在这个案例中,我向用户显示的错误并没有特别的帮助。我一直在使用它来获取错误消息,以便向我的用户显示: catch (Throwable t) { ... t.getMessage(); ... } 这通常工作得很好,通常会给用户提供比他们不知道如何处理的难看堆栈跟踪更好的消息。但是,在一种情况下,Hibernate引发异常,显示的错误消息是: 无法插入[some.class.name.Here] 这是毫无帮助的。错误的
catch (Throwable t) {
...
t.getMessage();
...
}
这通常工作得很好,通常会给用户提供比他们不知道如何处理的难看堆栈跟踪更好的消息。但是,在一种情况下,Hibernate引发异常,显示的错误消息是:
无法插入[some.class.name.Here]
这是毫无帮助的。错误的实际原因隐藏在堆栈跟踪中:
仅接受1753年1月1日至9999年12月31日之间的日期
给出第一条错误消息,我不知道出了什么问题。考虑到第二种情况,我至少知道看看我输入的日期。为了解决这个问题,我做了以下工作:
catch (Throwable t) {
...
ExceptionUtils.getExceptionMessageWithCauses(t);
...
}
...
public class ExceptionUtils
{
public static String getExceptionMessageWithCauses(Throwable t)
{
if ( t.getCause() == null ) {
return t.getMessage();
} else {
return t.getMessage()
+ "; caused by: "
+ getExceptionMessageWithCauses(t.getCause());
}
}
}
我首先担心的是,如果两个可丢弃类相互引用,我可能会进入某种无限循环。或者,类似地,根本原因是如此深刻,以至于即使显示来自Throwables的更友好的错误消息,也不会产生比堆栈跟踪更好的结果。因此,有两个问题:
谢谢 通常,您会在web层上验证用户输入,这样您就知道错误的输入是什么。如果您从hibernate或数据库驱动程序中获得SQLException,通常无法自动、完美地获得真正的原因 我们要做的是捕获所有可能对用户有任何意义的异常(它们通常是经过检查的异常),所有其他异常(通常是RuntimeExceptions)仅通过“发生内部错误”消息进行处理 我们有一个常见的异常是由我们的验证框架抛出的
ValidationException
,它携带生成一条好消息所需的所有数据(通常是可翻译的)
编辑:
有时可能需要遍历原因,以获得显示的异常。例如,我们有一些异常是由持久层抛出的,但它们是通过EJB层传递的,因此被包装在EJBExceptions
中。因此,我们反复查找原因,直到找到其中一个异常并显示一条好消息,或者显示“内部错误”消息
请注意,通常情况下,用户不应该遇到默认错误消息,因为大多数用户不知道这意味着什么(“嗯,什么是NullPointerException??)