捕获RuntimeException以进行日志记录是不好的做法吗?

时间:2017-08-10 08:09:32

标签: java exception-handling runtimeexception

我发现捕获RuntimeException通常被认为是不好的做法,因为它们无法纠正,通常是程序员错误。

但是,我们有一个(疯狂的)大型应用程序,其中任何部分的更改都可能产生无法预料的后果(是的,这本身就是一个问题)

现在,我们开始在应用程序的顶层开始捕获和记录RuntimeExceptions,这样我们就可以更有效地修复出现这些出血问题。

就像每个优秀的Java团队一样,我们有一个热情洋溢的叔叔鲍勃粉丝,绝对禁止我们这样做。

这样做有多糟糕?真的没有这种情况可以做甚至推荐吗?

4 个答案:

答案 0 :(得分:8)

捕获RuntimeExceptions不是问题,它们是异常,因此可以捕获并正确处理它们。如果Java开发人员希望您不捕获RuntimeExceptions,他们会将其命名为RuntimeError。

最糟糕的是捕获RuntimeExceptions,静默丢弃它们并继续运行,好像什么都没发生过一样。 RuntimeExceptions用于通知开发人员/用户关键问题以及程序明显离开预期状态的情况。至少应该记录下来,你应该尝试让程序恢复到舒适的状态。

如果你能在这种重大失败后继续完全取决于你的申请。网络服务器i.E.通常会捕获所有异常和错误,只需重新启动相应的Servlet,以便它们可以继续提供请求。

答案 1 :(得分:7)

抓住RuntimeException并不总是坏事。但即使你的团队决定不抓住RuntimeException,你也可以随时抓住它,记录一些东西然后重新抛出它。它根本不会改变你的应用程序逻辑。

现在几乎所有的记录器库都有可能记录有关异常的不同细节(如堆栈跟踪和所有嵌套异常)以及日志消息。

public void doStuff(String param){
  try {
    process(param);
  } catch(RuntimeException e) {
    logger.error("Something weird happened while processing " + param, e);
    throw e;
  }
}

<小时/> 以下是有关上下文的更新,感谢您Ralf Kleberhoff指出

最好只在应用程序的顶层记录有关RuntimeException(或任何其他Exception)的消息,以避免在日志中出现有关同一异常的重复消息。

如果你只是想添加一些上下文(比如参数值,如提到的Ralf Kleberhoff)而且它不是应用程序顶级catch(你确定,那个顶级实际存在catch),最好创建新的Exception并将原始Exception添加为新cause

public void doStuff(String param){
  try {
    process(param);
  } catch(RuntimeException e) {
    throw new RuntimeException("Something weird happened while processing " + param, e);
  }
}

private void process(String value){
  throw new IllegalStateException("Not implemented yet!");
}

答案 2 :(得分:0)

完全取决于流量以及捕捉它的位置。

如果您正在使用Spring,请考虑编写ControllerAdvice。在此处阅读更多内容https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html

答案 3 :(得分:0)

在需要时抓住RuntimeException是不好的做法。

当使用第三方代码时会抛出自己的异常RuntimeException然后需要来捕获它以便进行良好的异常处理。

同样在JSP中由于RuntimeException,抓住NullPointerException以防止页面根本不显示有时会很有帮助。