记一次生产上线遇到的问题
2019-07-14 02:04:48

 在一次版本升级中遇到一个问题,该程序是记录接口调用的日志,记录请求报文和返回报文等数据。代码写在接口调用的出入口,为了保证接口的调用不受此次新增的影响,因此把整块新增的代码写入try-catch中。测试环境升级后功能正常运行,可是升级到生产环境后发现系统很多接口出现报错,由于不能及时定位错误所以暂时回滚了此模块的代码。检查代码后并没有发现什么问题,并且新增代码是写在try-catch中的,更觉得不可能是代码逻辑方面的问题。因此查看生产服务器上的运行日志。因为这个模块重启过所有控制台日志stdout.log没有报错信息,于是又去查看系统的运行日志,由于这个模块是公共接口调出的作用,日志量也相当大,也不知道应该采用什么关键字搜索。突然想到系统回滚的时间,于是搜索这个时间之前一分钟的日志,果然此时发现异常的堆栈信息。看报错是由于javaNotFindClassException,有一个工具类没有找到,因为是用的dubbo,所以很明显是有一个这个工具类的jar包中没有所需要的类。重新上传最新版jar包后程序正常运行,但好奇的是为什么这段代码放到try-catch中还是因为报了异常,没有成功捕获。查了资料发现因为是javaNotFindClassException级别的异常,这种异常已经不属于业务代码的异常了而是属于级别更高的编译层面的,而我们这段程序代码所设置捕获的异常是Exception,因此自然而然无法正常捕获。如果此时将这块代码采用Throwable捕获异常程序就不会报错。

 看了相关资料后发现Throwable这种异常捕获虽然捕获的范围广但是也并不建议都这么做,因为异常捕获后是需要做异常补偿处理的。如果已经到触发了Throwable级别的异常意味着如果程序不做变动的话只要执行这段代码必定会出现异常,捕获异常这件事也没什么意义了。具体需要怎么做还是要根据当时的场景来决定的,而不能一味使用一种方法。

上一页
2019-07-14 02:04:48
下一页