java - 从 Throwable 获取根错误消息

标签 java exception

我正在对我正在做的一个网络项目进行错误处理,我遇到了一个情况,我向用户显示的错误并不是特别有帮助。我一直在使用它来获取错误消息,以便向我的用户显示:

catch (Throwable t) {
    ...
    t.getMessage();
    ...
}

这通常工作得很好,通常会给用户一个比丑陋的堆栈跟踪更好的消息,他们不知道如何处理。然而,在一种情况下,Hibernate 抛出异常并且显示的错误消息是:

could not insert [some.class.name.Here]

这非常没有帮助。错误的实际原因隐藏在堆栈跟踪中:

Only dates between January 1, 1753 and December 31, 9999 are accepted.

鉴于第一条错误消息,我不知道出了什么问题。考虑到第二个,我至少会知道看看我输入的日期。为了解决这个问题,我这样做了:

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());
        }
    }
}

我首先担心的是,如果两个 Throwable 类相互引用,我可能会陷入某种无限循环。或者,类似地,根本原因是如此之深,以至于即使显示来自 Throwable 的更友好的错误消息,也不会得到比堆栈跟踪更好的结果。那么,有两个问题:

  1. 做这样的事情“安全”吗?或者人们能想到这会在我面前爆炸的情况吗?

  2. 除了一一检查每一种可能的错误情况之外,还有更好的方法来处理异常吗?

谢谢!

最佳答案

嗯,您通常会在 Web 层上验证用户输入,因此您会知道错误的输入是什么。如果您从 hibernate 或数据库驱动程序收到 SQLException,您通常无法自动且完美地获取真正的原因。

我们所做的是捕获所有可能对用户有意义的异常(它们通常是检查异常),所有其他异常(通常是 RuntimeExceptions)仅使用“发生内部错误”消息进行处理。

我们遇到的一个常见异常是 ValidationException,它由我们的验证框架抛出,并携带生成良好消息(通常可翻译)所需的所有数据。

编辑:

有时可能需要遍历原因才能获得显示的异常。例如,我们的持久层抛出异常,但它们通过 EJB 层传递,因此被包装在 EJBExceptions 中。因此,我们迭代原因,直到找到异常之一并显示一条不错的消息,或者显示“内部错误”消息。

请注意,通常用户不应该遇到默认错误消息,因为大多数人不知道这意味着什么(“嗯,什么是 NullPointerException???”)

关于java - 从 Throwable 获取根错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5542891/

相关文章:

java - 如何仅更改一个字段来创建多个 xml 请求?

java - 如何在另一个线程中在 Canvas 上绘图?

python - 如何通过处理错误来完成流程?

Java 将日期转换为 EST 时区以遵守 DST

java - 单页应用。模板管理的安全性

java - entityManager.persist() 在 servlet 中工作,但不在单独的类中工作

c# - 将窗体设置为父级抛出异常 "Top-level control cannot be added to a control"

c# - 如何确定 asp.net Web 服务抛出的异常类型?

c# - Java 或 C# 异常管理的最佳实践

c++ - 有什么方法可以毫无异常(exception)地取消 boost 信号2中的信号传播?