需求:在catch的时候记录异常。
问题描述:现在我做的是在finally的时候通过ls_errmsg串来记录,但是发现问题在finally写的时候会出现问题,如插入,删除的时候无响应。如果在各个catch后面都记录的话这样同样的代码要重复多次,希望能得到指点。
public ActionForward doSave(Action action, HttpServletRequest request,HttpServletResponse response) throws Throwable {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
String policemanid= (String)request.getSession().getAttribute(Constants.ACC_LOGINNAME);
Hashtable requestData = WebUtil.getRequestData(request);
requestData.put("policemanid", policemanid);
String ls_errmsg = null, ls_ret = null;
try {
AddressBusiness business = (AddressBusiness)BasBusinessFactory
.getBusiness(REG_CODE);
business.doSave(requestData);
RecordSysOperate.setLog(requestData,"保存", Constants.NORMAL_POLICE, "保存核查地址", "普通民警保存核查地点");
} catch (BusinessException e) {
ls_errmsg = e.getMessage();
} catch (DaoException e) {
ls_errmsg = e.getMessage();
} catch (Exception e) {
ls_errmsg = "失败";
} finally {
// RecordSysOperate.setErrorLog(requestData,"保存", "保存核查地址",ls_errmsg);
ls_ret = "{\"success\":" + (ls_errmsg == null ? "true" : "false")
+ ",\"errmsg\":\"" + (ls_errmsg == null ? "" : ls_errmsg)
+ "\"}";
}
PrintWriter out = response.getWriter();
out.print(ls_ret);
out.close();
return null;
}

解决方案 »

  1.   

    你单步调试过吗?
    为什么要PrintWriter out = response.getWriter();
                out.print(ls_ret);
                out.close();
    这么做?
      

  2.   

    像doSave()方法,我在finally的时候做记录
    RecordSysOperate.setErrorLog(requestData,"保存", "保存核查地址",ls_errmsg);
    当我在调用到doSave()方法的时候,整个方法就没有相应了,也不报错。
    ---------------------------------------------------------------------
    我需要在方法抛出异常的时候记录日志,假如我在每个catch后面都加上
    RecordSysOperate.setErrorLog(requestData,"保存", "保存核查地址",e.getMessage());
    这句话,那它在doSave()方法里重复好多次,,有没有更好的策略,只做一次记录,捕捉到所有的异常??
      

  3.   

    不知道我理解对不对public ActionForward doSave(Action action, HttpServletRequest request,HttpServletResponse response) throws Throwable {
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("text/html; charset=UTF-8");
                String policemanid= (String)request.getSession().getAttribute(Constants.ACC_LOGINNAME);
                Hashtable requestData = WebUtil.getRequestData(request);
                requestData.put("policemanid", policemanid);
                String ls_errmsg = null, ls_ret = null;
                boolean resFlg = true; //DB操作结果
                try {
                    AddressBusiness business = (AddressBusiness)BasBusinessFactory
                    .getBusiness(REG_CODE);
                    business.doSave(requestData);
                    RecordSysOperate.setLog(requestData,"保存", Constants.NORMAL_POLICE, "保存核查地址", "普通民警保存核查地点");
                } catch (BusinessException e) {
                    resFlg = false;
                    ls_errmsg = e.getMessage();
                } catch (DaoException e) {
                    resFlg = false;
                    ls_errmsg = e.getMessage();
                } catch (Exception e) {
                    resFlg = false;
                    ls_errmsg = "失败";
                } finally {
                      if(!resFlg){ //判断DB操作结果
                         RecordSysOperate.setErrorLog(requestData,"保存", "保存核查地址",ls_errmsg);
                         ls_ret = ls_errmsg;
                      }else{
                         ls_ret = "true"
                      }
                }
                PrintWriter out = response.getWriter();
                out.print(ls_ret);
                out.close();
                return null;
            }
      

  4.   

    可能当ls_errmsg为NULL时,你的setErrorLog方法会抛出异常,而这个异常没有在doSave中捕获,直接throw出去了
      

  5.   

    谢谢楼上的,
    我在finally加个判断就行了,,
    if(ls_errmsg != null){
        RecordSysOperate.setErrorLog(requestData,"保存", "保存核查地址",ls_errmsg);
    }