gpt4 book ai didi

java - 从 Throwable 获取根错误消息

转载 作者:行者123 更新时间:2023-11-30 05:04:34 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com