• 011医疗项目-模块一:统一异常处理


    010中提到了serivce层抛出异常,然后由Action层去捕获异常去处理,之前的写法是用java 自带的Exception,这样很繁琐的,而且,使用原始的Exception中的message不够用,需要自定义一个ExceptionResultInfo异常类解决信息不足的问题。

    所以我们这里编写一个自定义的异常类,统一异常处理。

    Java中进行异常处理:

    一类是可预知的异常,程序员在编码时,主动抛出的异常,为了给用户操作提示,提前检查代码中可能存在异常。

    通过开发中,采用自定义的异常类,每个异常类表示每一类异常信息。类需要继承Exception类。

    本系统采用统一异常类,提供一个属性标识异常类。

    另一类是不可预知异常,就是runtimeException异常,通过提高代码编写质量来避免此类异常,也可通过后期测试 人员进行系统功能测试对runtime异常进行避免。

      我们主要对可预知的异常处理进行处理:

    我们先要定义一个自己的异常类:

    package yycg.base.process.result;
    
    
    /**
     * 自定义系统异常类
     */
    public class ExceptionResultInfo extends Exception {
    
        // 系统统一使用的结果类,包括了 提示信息类型和信息内容
        private ResultInfo resultInfo;
    
        public ExceptionResultInfo(ResultInfo resultInfo) {
            super(resultInfo.getMessage());
            this.resultInfo = resultInfo;
        }
    
        public ResultInfo getResultInfo() {
            return resultInfo;
        }
    
        public void setResultInfo(ResultInfo resultInfo) {
            this.resultInfo = resultInfo;
        }
    
    }

    我们看一下ResultInfo 这个类,包含了异常的信息。

    package yycg.base.process.result;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import yycg.util.ResourcesUtil;
    
    /**
     * 系统提示信息封装类
     * @author mrt
     *
     */
    public class ResultInfo
    {
        public static final int TYPE_RESULT_FAIL = 0;//失败
        public static final int TYPE_RESULT_SUCCESS = 1;//成功
        public static final int TYPE_RESULT_WARN = 2;//警告
        public static final int TYPE_RESULT_INFO = 3;//提示信息
        
        public ResultInfo(){}
    
        /**
         * 消息提示类型
         */
        private int type;
            
        
        /**
         * 提示代码
         */
        private int messageCode;
        
           
        /**
         * 提示信息
         */
        private String message;
        
        
        /**
         * 提示信息明细列表
         */
        private List<ResultInfo> details;
        
        public List<ResultInfo> getDetails() {
            return details;
        }
    
    
        public void setDetails(List<ResultInfo> details) {
            this.details = details;
        } 
        
        /**
         * 提示消息对应操作的序号,方便用户查找问题,通常用于在批量提示信息中标识记录序号
         */
        private int index;
        
        
        /**
         * 提交后得到到业务数据信息从而返回给页面
         */
        private Map<String,Object> sysdata = new HashMap<String, Object>();
        
        /**
         * 构造函数,根据提交信息代码messageCode获取提示信息
         * @param MESSAGE
         */
        public ResultInfo(final int type,int messageCode,String message){
            this.type = type;
            this.messageCode = messageCode;
            this.message = message;
        }
        
       
        public int getMessageCode() {
            return messageCode;
        }
    
    
    
    
        public void setMessageCode(int messageCode) {
            this.messageCode = messageCode;
        }
    
    
        public String getMessage() {
            return message;
        }
        
        
        public void setMessage(String message) {
            this.message = message;
        }
    
    
        public int getType() {
            return type;
        }
    
        public void setType(int type) {
            this.type = type;
        }
    
        public boolean isSuccess(){
            if(this.type == TYPE_RESULT_SUCCESS){
                return true;
            }
            return false;
        }
    
        public int getIndex() {
            return index;
        }
        public void setIndex(int index) {
            this.index = index;
        }
      
        public Map<String, Object> getSysdata() {
            return sysdata;
        }
    
    
        public void setSysdata(Map<String, Object> sysdata) {
            this.sysdata = sysdata;
        }
    
    
    
    }

    有了这两个类,我们就可以继续往下做了。在Service层里去抛出异常,然后在Action中去捕获异常。

    我们修改userServiceimpl.java中的insertSysuser函数,把之前的用抛出Exction的做法改为统一的异常类来处理。

    @Override
        public void insertSysuser(SysuserCustom sysuserCustom) throws Exception {
    
            //参数的校验
            //通用的参数合法性校验
            
        Sysuser sysuser=findSysuerByUserid(sysuserCustom.getUserid());
        //如果不等于空,就是账号重复了。给出一个警告。
            if(sysuser!=null)
            {
                //抛警告到Action,可以在Aciton中捕获这个异常。
               //使用系统自定义的异常类
                ResultInfo resultInfo=new ResultInfo();
    //设置异常的类型:是正确的还是错误的. resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL); resultInfo.setMessage(
    "是账号重复了"); throw new ExceptionResultInfo(resultInfo);//这里抛的就是我们自己定义的异常类了。 } //根据用户类型,输入单位名称必须存在对应的单位表中 String groupid=sysuserCustom.getGroupid();//用户类型 String sysmc=sysuserCustom.getSysmc();//单位名称 String userid=null; if(groupid.equals("1")||groupid.equals("2")) {//监督单位 //根据单位名称查询单位的信息。 Userjd userjd=this.findUserJdByMc(sysmc); if(userjd==null) { //使用系统自定义的异常类 ResultInfo resultInfo=new ResultInfo(); resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL); resultInfo.setMessage("单位名称输入错误"); throw new ExceptionResultInfo(resultInfo); } userid=userjd.getId(); } //卫生室 else if(groupid.equals("3")) { //根据单位名称查询单位的信息,查不到就报错 Useryy useryy=this.findUseryyByMc(sysmc); if(useryy==null) { //throw new Exception("单位名称输入错误"); //使用系统自定义的异常类 ResultInfo resultInfo=new ResultInfo(); resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL); resultInfo.setMessage("单位名称输入错误"); throw new ExceptionResultInfo(resultInfo); } userid=useryy.getId(); } else if(groupid.equals("4")){ Usergys usergys=this.findUsergesByMc(sysmc); if(usergys==null) { //throw new Exception("单位名称输入错误"); //使用系统自定义的异常类 ResultInfo resultInfo=new ResultInfo(); resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL); resultInfo.setMessage("单位名称输入错误"); throw new ExceptionResultInfo(resultInfo); } userid=usergys.getId(); } sysuserCustom.setId(UUIDBuild.getUUID());         sysuserCustom.setSysid(userid);//把用户表设置工作单位id //把数据插入到数据库 //刚开始的时候感到很奇怪,就是在SysuserMapper.xml中写着输入的参数是yycg.base.pojo.po.Sysuser //但是我这里输入的是sysuserCustom,明显不是Sysuser类型啊,其实是没有关系的,因为,这里的sysuserCustom //继承了Sysuser.所以Sysuser里面有的,在SysuserCustom里面都是有的的。 sysuserMapper.insert(sysuserCustom); }

    接着修改Action层代码:之前的做法是在UserAction中返回Map类型的。这里改动很大。返回一个自己写的一个类。

    //添加用户提交
        //提交的结果要转json到页面
        //提交表单的数据一律使用包装类,这里我们用的是SysuserQueryVo
        //在SysuserQueryVo中包装了SysuserCustom
        @RequestMapping("/addsysusersubmit")
        public @ResponseBody SubmitResultInfo addsysusersubmit(SysuserQueryVo sysuserQueryVo) throws Exception
        {//提示用户的信息。
            /*String message="操作成功";
            int type=0;//0表示成功,1表示失败
    */        
            ResultInfo resultInfo=new ResultInfo();
            resultInfo.setType(ResultInfo.TYPE_RESULT_SUCCESS);//默认是成功的,如果没有异常就把这个置于submitResultInfo,通过ResponseBody,转变为json返回到JSp页面。
            resultInfo.setMessage("成功了");
            SubmitResultInfo submitResultInfo=new SubmitResultInfo(resultInfo);
            try {
                //调用Service执行用户的添加。
                userService.insertSysuser(sysuserQueryVo.getSysuserCustom());
            } catch (Exception e) {
                e.printStackTrace();
                /*message=e.getMessage();
                type=1;//表示失败。
    */        
                //这样的话就是系统的自定义异常
                if(e instanceof ExceptionResultInfo)
                {
                    //解析系统的自定义的异常,
                    resultInfo=((ExceptionResultInfo) e).getResultInfo();
                
                }else {
                    //不属于系统自定义异常的话就是未知错误的异常,就是不可知的异常
                    //resultInfo=new ResultInfo();
                    resultInfo.setType(ResultInfo.TYPE_RESULT_FAIL);
                    resultInfo.setMessage("未知错误异常");
                    
                }
                
                
            }
            //将执行结果返回页面
            
            submitResultInfo.setResultInfo(resultInfo);
            
            return submitResultInfo;
            
        }

    接下来看一下SubmitResultInfo里面是什么?

    package yycg.base.process.result;
    
    
    /**
     * 系统提交结果结果类型
     * @author Thinkpad
     *
     */
    public class SubmitResultInfo {
    
        public SubmitResultInfo(ResultInfo resultInfo){
            this.resultInfo = resultInfo;
        }
        
        //操作结果信息
        private ResultInfo resultInfo;
        
        public ResultInfo getResultInfo() {
            return resultInfo;
        }
    
        public void setResultInfo(ResultInfo resultInfo) {
            this.resultInfo = resultInfo;
        }
            
    }

    当我们的Action把submitResultInfo返回后,所以在页面要统一使用一个方法解析json结果,我们看一下,jsp页面做了什么。

    jsp执行的是jquerySubByFId('userform',sysusersave_callback,null,"json");所以当Action把json数据返回时,执行的回调函数是:sysusersave_callback

    好!

    这个函数里面就一句代码

      function sysusersave(){
          //准备使用jquery 提供的ajax Form提交方式
          //将form的id传入,方法自动将form中的数据组成成key/value数据,通过ajax提交,提交方法类型为form中定义的method,
          //使用ajax form提交时,不用指定url,url就是form中定义的action
          //此种方式和原始的post方式差不多,只不过使用了ajax方式
          
          //第一个参数:form的id
          //第二个参数:sysusersave_callback是回调函数,sysusersave_callback当成一个方法的指针
          //第三个参数:传入的参数, 可以为空
          //第四个参数:dataType预期服务器返回的数据类型,这里action返回json
          //根据form的id找到该form的action地址
          jquerySubByFId('userform',sysusersave_callback,null,"json");
          
      }
      //ajax调用的回调函数,ajax请求完成调用此函数,传入的参数是action返回的结果
      function sysusersave_callback(data){
          
          message_alert(data);
       
          
      }

    就是 message_alert(data)对Action返回的JSON数据进行处理。

    我们看一下 message_alert(data)里面的代码:

    到这里就完成了统一异常类的处理。

  • 相关阅读:
    iOS之蓝牙开发—CoreBluetooth详解
    iOS-GCD使用详解
    iOS—Mask属性的使用
    idea导入eclipse中的maven项目
    SQL Server 查找字符串中指定字符出现的次数
    lLinux的常用命令
    从excel表中生成批量SQL
    ORA-00911: invalid character 错误解决
    sqlserver sp_who2和inputbuffer的使用,连接数
    如果存在这个表,则删除这个表的sql
  • 原文地址:https://www.cnblogs.com/shenxiaoquan/p/6049106.html
Copyright © 2020-2023  润新知