今天遇到一個讓人無語的代碼塊
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塊里的任何代碼了。