为日志记录目的捕获RuntimeException是不好的做法吗?

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

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

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

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

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

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

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

 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 )的消息,以避免在日志中出现有关同一exception的重复消息。

如果您只想添加一些上下文(如参数值,如Ralf Kleberhoff所提到的)并且它不是应用程序顶级catch (并且您确定,顶级catch实际存在),最好创建一个新的Exception并添加原始Exception作为新cause的一个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!"); } 

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

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

如果你能在这种重大失败后继续完全取决于你的申请。 Web服务器iE通常会捕获所有exception和错误,只需重新启动相应的Servlet即可继续为请求提供服务。

完全取决于流量和捕获它的位置。

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

在需要时捕获RuntimeException 并不是一个坏习惯。

当使用第三方代码抛出自己的exception扩展RuntimeException然后你需要捕获它以便进行良好的exception处理时,它会很有用。

同样在JSP中有时候有助于捕获RuntimeException以防止由于NullPointerException而导致页面根本不显示。