一个bug
各位请先看一段获取客户端链接的代码:
Client client = getClient();
private Client getClient() throws Exception {
try {
if (client == null || !client.ping()) {
client = reConnect();
}
} catch (Exception e) {
logger.error("reConnect exception", e);
}
return client;
}
代码初衷是getClient()
失败时尝试reConnect()
,可问题是程序的定时任务调用getClient()
总是重连失败,报错reConnect exception
,导致业务逻辑总是无法正常运作。
原因解析
我review代码好久,都没想明白原因,只好debug调试。
debug到if (client == null || !client.ping())
时,就直接跳到catch
语句。原来,真相是client.ping()
就直接报异常跳出了,那么就永远走不到reConnect()
了。自然永远都无法拿到可用的client
。
启示
这段简单的代码却花了不少时间排查。也主要是潜意识认为,像
ping()
这种行为即使异常出错那么就应该返回false
。没想到它内部代码的处理这么简单直接。第三方代码深不可测。使用第三方代码需谨慎,并做好各种防御性。
仅仅review难以看出问题,还需实战。