java - 异常处理标准建议

标签 java exception logging jakarta-ee exception-handling

在 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/

相关文章:

java - 改变方法

java - 如何使用 Google 脚本和 Google 表格在指定日期前 3 天发送电子邮件?

java - 二叉搜索树与 MultiMap

java - 动态 Log4j2 日志文件路径

java - HTTP 状态 500 - 内部服务器错误 - JSP - Glass Fish 服务器

logging - python : Logging exceptions with custom *kwargs

python - 在 sqlalchemy 代码的单元测试中使用assertRaises 时无法理解结果

visual-studio - 在Visual Studio中进行负载测试期间的套接字异常

logging - rust-将环境变量加载到log4rs yml文件中

python 2.4日志记录-循环内的动态日志文件名