我发现捕获RuntimeException通常被认为是不好的做法,因为它们无法纠正,通常是程序员错误。
但是,我们有一个(疯狂的)大型应用程序,其中任何部分的更改都可能产生无法预料的后果(是的,这本身就是一个问题)。
现在,我们开始在应用程序的顶层开始捕获和记录RuntimeExceptions,这样我们就可以更有效地修复出现这些出血问题。
就像每个优秀的Java团队一样,我们有一个热情洋溢的叔叔鲍勃粉丝,绝对禁止我们这样做。
这样做有多糟糕?真的没有这种情况可以做甚至推荐吗?
答案 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
以防止页面根本不显示有时会很有帮助。