java程序中try应该怎么使用呢?
在睿智的时候,架构师(中兴)萧哥告诉我不要动不动就把业务上的错误包装成异常抛出,再捕获处理,因为抛出异常再try捕获处理消耗的性能是巨大的。要把业务上的错误在写程序时要考虑到,然后手工处理。在来这家公司之前,我一直都是这么做的,但是现在看到公司的程序不管是业务上还是程序上的异常全部是抛出异常,try捕获处理的。这然我很疑问,这两种方法到底如恶化选择呢?
先看现在公司的代码:
控制器代码
@AccessRight(rightsCode=16,accessLevel=Constant.ACCESS_LEVEL_SUPER)
@RequestMapping("/del")
public BaseResponse doDel(@RequestBody DeleteMemberGroupReqData reqData, User user){
DeleteMemberGroupRespData respData = new DeleteMemberGroupRespData();
try{
memberGroupService.delete(reqData);
}catch(Exception e){
respData.setReturnCode(Constant.RETURN_CODE_UNDIFINE_ERR);
respData.setReturnMsg(getErrorMsg(e));
}
return respData;
}
==业务代码(原来的)==
/**
* 删除 sp_gm_MemberGroup_DELETE
*/
public void delete(DeleteMemberGroupReqData reqData){
if(memberGroupMapper.getCustomerCount(reqData.getId())>0){
throw new ResultExcpetion("该集团存在客户,不能删");
}else{
SqlUtils.checkOneRowAffect(memberGroupMapper.delete(reqData.getId()));
}
}
checkOneRowAffect 代码:
public static void checkOneRowAffect(int count){
checkOneRowAffect(count,"");
}
public static void checkOneRowAffect(int count,String msg){
if(0==count){
if(StringUtils.isNotEmpty(msg)){
throw new ResultExcpetion("msg");
}else {
throw new ResultExcpetion("资料已在修改前被他人更攺");
}
}else if(count>1){
throw new ResultExcpetion("更新行数超过一行");
}
}
==按照原来的理解,业务代码应该是这样写:==
//修改后
public ReturnMsg delete(DeleteMemberGroupReqData reqData){
ReturnMsg returnMsg = new ReturnMsg();
if(memberGroupMapper.getCustomerCount(reqData.getId())>0){
returnMsg.setReturnCode("0001");
returnMsg.setMsg("该集团存在客户,不能删");
return returnMsg;
}else{
处理并返回数据
...
... SqlUtils.checkOneRowAffect(memberGroupMapper.delete(reqData.getId()));
}
}
对比两种方式,就代码的便捷性上,抛出捕获异常这种方式更好一些,但性能消耗就多一些,如果在一台服务器上同时又有很多这样的处理,服务器性能肯定就下降很多。
如果通过在代码中判断业务的方式,就不用总是抛出捕获异常了,但是代码就写的比较多,在实际工作中可能会漏掉一些业务判断,这要求更细心,对业务更加深入了解。
所以对于要求性能高的,并发高的系统抛出捕获异常这种方式就不行了,第二种就好都哦了;反之,如果只是做一个公司内部使用的OA系统,就可以使用异常的方式了。