别再瞎搞了,处理Java异常的10个最佳实践
线上代码不要使用printStackTrace()
写完代码后请一定要检查下,代码中千万不要有printStackTrace()。因为printStackTrace()只会在控制台上输出错误的堆栈信息,他只适合于用来代码调试。
真正需要记录异常,请使用日志记录。
永远不要在catch块中吞掉异常
catch (NoSuchMethodException e) {
return null;
}
永远不要不处理异常,而是返回null,这样异常就会被吞掉,无法获取到任何失败信息,会给日后的问题排查带来巨大困难。
在需要的地方声明特定的受检异常
public void foo() throws Exception { //错误做法
}
public void foo() throws SpecificException1, SpecificException2 {
//正确做法
}
### 始终只捕获那些可以处理的异常
catch (NoSuchMethodException e)
{
throw e; //这代码一点用都没有
}
尽量捕获特定的子类,而不是直接捕获Exception类
try {
someMethod();
}
catch (Exception e)
{
LOGGER.error("method has failed", e);
}
永远不要捕获Throwable类
始终在自定义异常中覆盖原有的异常,这样堆栈跟踪就不会丢失
catch (NoSuchMethodException e)
{
throw new MyServiceException("Some information: " + e.getMessage()); //错误做法
}
catch (NoSuchMethodException e) {
throw new MyServiceException("Some information: " , e); //正确做法
}
可以记录异常或抛出异常,但不要同时做
catch (NoSuchMethodException e) {
LOGGER.error("Some information", e);
throw e;
}
永远不要在finally中抛出异常
try {
someMethod(); //抛出 exceptionOne
}
finally
{
cleanUp(); //如果在这里再抛出一个异常,那么try中的exceptionOne将会丢失forever
}
如果您不打算处理异常,请使用finally块而不是catch块
try {
someMethod();
}
finally
{
cleanUp();
}
往期推荐
为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?
前几天内推的读者,已经入职阿里了。
放弃Maven以后,我用了它。。。
直面Java第329期:哪个命令可以监控虚拟机各种运行状态信息?
深入并发第013期:拓展synchronized——锁优化
评论