一个低级错误分析解决过程

昨天简单记叙了我六、七年的跑步这件事情,本来今天想写写我跑半程与全程的感受与些许想法。但是,今天在写代码的时候出现一个低级错误,而我解决这个错误却是绕了一圈才解决的。这种事情写代码的时候时不时会发生一次,原来没有记叙的习惯,现在打算养成这么个习惯,所以临时决定写写这次错误的发生与解决,让自己回想回想。

背景

这个错误的案例背景是我用WebService去调用阿里百川的OpenIM的SDK,达到阿里百川的用户信息能够与我们平台的用户信息能够得到同步,如昵称、头像等。

过程

在写WebService之前,我对其API封装了一层Service,并用单元测试对其进行测试(其实,我现在还没有很好的养成写单元测试的习惯)。测试了一组数据,其结果都和预期一样,证明咱写的这个服务是没有什么问题的,可以大胆的使用。

然后,我就开始写WebService,其实也就是在封装一下,本以为完成就能够解决问题。在满怀希望看结果的时候,上帝就给你开个小玩笑,然后WebService返回了下面的信息:

1
2
3
4
5
6
7
<soapenv:Envelope><soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.userException</faultcode>
<faultstring>java.lang.reflect.UndeclaredThrowableException</faultstring>
<detail><ns1:hostname>hostname</ns1:hostname></detail>
</soapenv:Fault>
</soapenv:Body></soapenv:Envelope>

看到这个信息,我不知道为什么本能的以为是OpenIM SDK有问题(在调用第三方库的时候,这些第三方库总是被我怀疑,为什么会这样,为什么会这样,算了,先不想了)。于是,我就在想是不是这个SDK与Web Service有什么冲突之类的(毫无根据)。
怀疑归怀疑,还得看数据信息不是? 在这次调用的时候,我其实是写了三个服务的,在这个服务没有通过之后,再去测试另外两个服务,结果发现运行的好好的。这时,我再结合单元测试是OK这一结果,彻底否定了服务有问题这一想法。想着,一定是代码哪里不小心出了问题。

这时,再看Web Service反馈的信息,说是userException,说实话这个我不知道是什么异常,但是后面的信息还是很醒目的UndeclaredThrowableException。就这么一句,我意识到我的代码有个地方有个未知异常没有捕获。于是再看代码,再看打印日志的时候,发现压根就没有进入我封装的OpenIM SDK服务内,在调用服务之前的代码有一段代码是判断一个字符串是否合规的if语句。这个时候,一看就能明白,这个字符串忘记判断是否为空了,加上这个判断,果然就没有问题,服务也正常被调用。虽然问题找到了,还是忍不住说了句:我x,居然出现这么个低级错误。

最后

在解决这个错误之后,我想起前段时间参加的技术沙龙有讨论类型安全问题,这个其实多少也算这么个分支。又想想平时写代码,总喜欢看运行结果。好多代码边界问题,异常问题都容易被我忽略,所以时不时出现一下冷不防的错误,需要花时间去解决。

还有就是写代码总是不太习惯在关键地方打印日志(上文说的看日志,是后面才加的,开始并没有),做些条件判断,总感觉程序能够在正确的环境做正确的事情,出意料之中的结果。可这显然是不太可能的,关于这点得改改,不能偷懒。