错误处理之try、catch、finally中的return、throw执行顺序。

今天遇到一个让人无语的代码块

        try {
            bilSheetService.syncUser(bilWebseviceLog, userId, optType);
        }catch (Exception e){
            bilWebseviceLog.setReturnCode("1");
            bilWebseviceLog.setReturnDesc(e.getMessage()); 

throw new RuntimeException(e.getMessage());
        }finally {
            bilWebseviceLogService.add(bilWebseviceLog);
        }

而这个代码块在service层,也就说,日志的记录永远记录不到调用接口失败的日志(service层有做事务控制,异常会让事务进行回滚)。

我只能说写这代码的仁兄可能对try、catch、finally中的return、throw执行顺序有点误解。

当程序执行try块,catch块时遇到return语句或者throw语句,这两个语句都会导致该方法立即结束,但是系统并不会立即执行这两个语句,而会去寻找该异常处理流程中的finally块,之后才会执行return语句或者throw语句让方法终止。有finally块的时候,系统立即开始执行finally块,只有当finally块执行完成后,系统才会再次跳回来执行try块、catch块里的 return或throw语句,如果finally块里也使用了return或throw等导致方法终止的语句,则finally块已经终止了方法,不会再跳回去执行try块、catch块里的任何代码了。

猜你喜欢

转载自www.cnblogs.com/saoyou/p/10538361.html