java - 更好地理解 J2EE 环境中的异常和日志记录

标签 java jakarta-ee log4j

我试图更好地理解异常处理和在 j2ee 环境中记录以重构一些遗留代码(我们使用 log4j 作为我们的记录机制)。我们当前的大部分代码在业务层上执行类似于下面代码的操作,但是,我想切换到未经检查的异常并忽略它们,除非在某个地方处理它们是有意义的:

try {
    doSomething();
} catch (MyException e) {
    log.error("Exception:", e);
    throw e;
}

在业务层抛出异常后,它会向上传播到表示层,再次捕获异常并通常将其包装在 PortletExceptionServletException 并再次抛出它。然后,它由 Spring 处理程序处理,向用户显示“友好”消息。我最终只想处理我们想要显示特定错误消息的异常,而忽略其他一切。

问题:

  1. 是否有必要在业务层记录异常情况?如果没有,做 我是否需要记录异常(尤其是未经检查的异常)?
  2. 未使用 log4j 记录的未捕获异常会怎样? (如果它们仍然打印在控制台中,目的是什么 log4j?)

我对这个过程如何运作感到困惑......

谢谢。

编辑:如果在外部库(Spring、Hibernate 等)中发生异常,是否假定这些异常将使用正在使用的任何日志记录机制打印出来?在那种情况下,我想我只需要记录我的代码抛出的异常......或者我在这里偏离基地了吗?

最佳答案

在继续之前,请仔细查看:

The following are some of the generally accepted principles of exception handling:

  1. If you can't handle an exception, don't catch it.
  2. If you catch an exception, don't swallow it.
  3. Catch an exception as close as possible to its source.
  4. Log an exception where you catch it, unless you plan to rethrow it.
  5. Structure your methods according to how fine-grained your exception handling must be.
  6. Use as many typed exceptions as you need, particularly for application exceptions.

Point 1 is obviously in conflict with Point 3. The practical solution is a trade-off >?between how close to the source you catch an exception and how far you let it fall before you've completely lost the intent or content of the original exception.

IBM DeveloperWorks: EJB best practices

通常建议您在业务层对应用程序异常使用检查异常。我更喜欢遵循业务界面模式,将业务层与用户界面和 Web 层分离。这将使我能够将您的业务层视为服务层库,并且调用者在调用该层时可能希望以不同的方式处理不同的情况。这就是您可能希望包含已检查异常的原因之一,因为您可以对不同的异常做出不同的 react 。此外,包括已检查的异常通常会帮助调用者代码更好地了解调用某些功能可能会出现哪些不同情况。查看业务委托(delegate)模式以及它如何帮助您进行异常处理可能是值得的。简而言之,business delegate pattern允许您在业务层和 Web 层之间创建一个非常薄的层,您可以在其中执行异常处理等操作。

无论您如何着手执行此操作,请确保您了解将应用程序异常添加到您的 Java EE 应用程序的含义。您可能需要调查它如何与您的事务管理逻辑交互,特别是涉及到事务回滚时。在我的工作中,我必须添加一个 @ApplicationException(rollback=false) 来禁止事务管理器在异常被抛出并向上传播时回滚我的事务。

您可能会看出我在使用 EJB,但这些概念可能也非常适用于您的设计。

回到你的问题:

Is it necessary to log exceptions in the business tier?

如果您打算稍后登录,则没有必要。您最好设计一个高级别的日志记录策略,并在那里记录所有捕获的异常。

If not, do I need to log exceptions at all (especially unchecked ones)?

我认为您应该记录异常,因为这将有助于您稍后调试任何问题。用户通常不够聪明,无法捕获异常传播并在您未处理的情况下打印在他/她的屏幕上时可能产生的任何输出。

What happens to uncaught exceptions that are not logged using log4j? (If they're still printed in the console, what's the purpose of log4j?)

我认为它最终会被 web 容器捕获并打印到控制台。如果异常向上传播并到达 Web 容器异常处理安全网,您的异常就会失控。这通常是糟糕设计的标志。最好控制异常情况。为什么想知道容器将如何对未捕获的异常使用react?另外,该异常(exception)对用户有多大好处?我认为未捕获的异常所提供的信息几乎是无用的,因为它们与错误的根源相去甚远,以至于在调试时变得无关紧要且难以处理。

关于java - 更好地理解 J2EE 环境中的异常和日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8015072/

相关文章:

java - 在 weblogic 中使用 log4j 日志记录 9/10

java - Java 中对象的压缩和扩展

java - NDK 支持不同的 Product Flavor

java - Android 应用程序中的 NumberFormatException

java - Jackrabbit存储库的部署模型

java - Oracle/Java 应用,推荐架构

java - hql - 按列表的第一项排序

java - 如何在 ExoPlayer2 中隐藏控制按钮

java - log4j2.xml 文件在 tomcat web 应用程序中的正确位置

java - 我可以使用带有 log4j.properties 文件的 log4j 1.x 异步运行我的日志吗?