gpt4 book ai didi

java - 异常处理标准建议

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:51 24 4
gpt4 key购买 nike

在 j2ee 应用程序中,我计划标准化异常处理策略。不再吞噬异常并基本上将所有已检查异常转换为未检查异常(除了一些实际上可以从中恢复的异常。标准将是所有异常都将被抛回容器(例如:http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html) . SQLException 之类的异常是无法恢复的,如果它发生在数据层深处,我将强制它向上返回。但是,诸如电子邮件通知之类的小子例程将被包裹在一个try catch 以防止发生异常而破坏整个应用程序流程。(例如:为什么要阻止整个过程完成,因为用户没有收到他们根本不需要的电子邮件通知!)

对此有何建议?再次重申,我基本上将所有异常重新抛回到有自己的错误页面的容器,然后它也将其记录到 log4j。

最佳答案

我认为电子邮件示例是检查异常的最佳防御。你有一些可能出错的东西并且是暂时的,所以检查异常的存在让你考虑它。如果一切都是运行时异常,您的应用程序就会因为微不足道的原因而崩溃,没有人会考虑它。

无论如何,如果对于您的项目,一般答案是将其放在顶部,那么包装在运行时异常中是完全有效的。需要考虑的几件事:

坚持异常链接。不这样做的唯一原因是,如果您正在序列化异常,那么某些包含不可序列化成员的异常可能会变得有趣。情况似乎并非如此,因此不允许吞入异常。如果必须,请使用 initCause。这是我们项目中的一个小辅助方法:

public static <T extends Throwable> T initCause(T newException, Throwable cause) {
return (T) newException.initCause(cause);
}

这有助于人们避免抛出异常。

我更喜欢避免不必要的 RuntimeException 和 Error Throwable 链接,当一个方法上有许多不同的 Checked Exception 并且开发人员只是捕获 Exception 时不可避免地会发生这种情况,所以我推荐一个静态方法来做这样的事情:

public static void throwRuntimeExceptionFromThrowable(Throwable e) {
if (e == null) {
return;
} else if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else if (e instanceof Error) {
throw (Error) e;
} else {
throw new RuntimeException(e.getMessage(), e);
}
}

这有两个选项。一种是使它无效(如这段代码所做的那样),它的好处是调用者永远不会忘记抛出结果。缺点是如果你有这样的东西:

public Object someMethod() {
try {
return getTheObject();
} catch (Exception e) {
throwRuntimeExceptionFromThrowable(e);
}
}

编译器不会喜欢你。您必须在捕获之后返回,并在尝试之前声明一个变量。

另一种选择是将异常作为 RuntimeException 返回(仅抛出错误)并让调用者抛出异常。编译器更快乐,但调用者可能会忘记这样做,调用方法时没有在它前面抛出异常,然后异常就被吞掉了。

关于java - 异常处理标准建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/836104/

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