异常问题-异常处理

5 异常处理

5.1 异常处理的问题分析

  1. 示例代码
//添加页面 
    public CmsPageResult add(CmsPage cmsPage) { 
 
   
        //校验页面是否存在,根据页面名称、站点Id、页面webpath查询 
        CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
        if (cmsPage1 == null) { 
 
   
            cmsPage.setPageId(null);
            //添加页面主键由spring data 自动生成 
            cmsPageRepository.save(cmsPage);
            //返回结果 
            CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS, cmsPage);
            return cmsPageResult;
        }
        return new CmsPageResult(CommonCode.FAIL, null);
    }

问题:java

  1. 上边的代码只要操做不成功仅向用户返回“错误代码:11111,失败信息:操做失败”,没法区别具体的错误信 息。
  2. service方法在执行过程出现异常在哪捕获?在service中须要都加try/catch,若是在controller也须要添加 try/catch,代码冗余严重且不易维护。

解决方案:程序员

  1. 在Service方法中的编码顺序是先校验判断,有问题则抛出具体的异常信息,最后执行具体的业务操做,返回成 功信息。
  2. 在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息。

代码模板以下:web

//添加页面 
    public CmsPageResult add(CmsPage cmsPage) { 
 
   
        //校验cmsPage是否为空 
        if (cmsPage == null) { 
 
   
            //抛出异常,非法请求 
            // ... 
        }
        //根据页面名称查询(页面名称已在mongodb建立了惟一索引) 
        CmsPage cmsPage1 = cmsPageRepository.findByPageNameAndSiteIdAndPageWebPath(cmsPage.getPageName(), cmsPage.getSiteId(), cmsPage.getPageWebPath());
        //校验页面是否存在,已存在则抛出异常 
        if (cmsPage1 != null) { 
 
   
            //抛出异常,已存在相同的页面名称 
            // ... 
        }
        cmsPage.setPageId(null);
        //添加页面主键由spring data 自动生成 
        CmsPage save = cmsPageRepository.save(cmsPage);
        //返回结果 
        CmsPageResult cmsPageResult = new CmsPageResult(CommonCode.SUCCESS, save);
        return cmsPageResult;
    }

5.2 异常处理流程

系统对异常的处理使用统一的异常处理流程:spring

  1. 自定义异常类型。
  2. 自定义错误代码及错误信息。
  3. 对于可预知的异常由程序员在代码中主动抛出,由SpringMVC统一捕获。可预知异常是程序员在代码中手动抛出本系统定义的特定异常类型,因为是程序员抛出的异常,一般异常信息比较 齐全,程序员在抛出时会指定错误代码及错误信息,获取异常信息也比较方便。
  4. 对于不可预知的异常(运行时异常)由SpringMVC统一捕获Exception类型的异常。不可预知异常一般是因为系统出现bug、或一些不要抗拒的错误(好比网络中断、服务器宕机等),异常类型为 RuntimeException类型(运行时异常)。
  5. 可预知的异常及不可预知的运行时异常最终会采用统一的信息格式(错误代码+错误信息)来表示,最终也会随 请求响应给客户端。

异常抛出及处理流程:
在这里插入图片描述mongodb

  1. 在controller、service、dao中程序员抛出自定义异常;springMVC框架抛出框架异常类型
  2. 统一由异常捕获类捕获异常,并进行处理
  3. 捕获到自定义异常则直接取出错误代码及错误信息,响应给用户。
  4. 捕获到非自定义异常类型首先从Map中找该异常类型是否对应具体的错误代码,若是有则取出错误代码和错误 信息并响应给用户,若是从Map中找不到异常类型所对应的错误代码则统一为99999错误代码并响应给用户。
  5. 将错误代码及错误信息以Json格式响应给用户。

5.3 可预知异常处理

5.3.1 自定义异常类

  1. 代码示例
public class CustomException extends RuntimeException { 
 
   
    private ResultCode resultCode;

    public CustomException(ResultCode resultCode) { 
 
   
        //异常信息为错误代码+异常信息 
        super("错误代码:" + resultCode.code() + "错误信息:" + resultCode.message());
        this.resultCode = resultCode;
    }

    public ResultCode getResultCode() { 
 
   
        return this.resultCode;
    }
}

5.3.2 异常抛出类

  1. 代码示例
public class ExceptionCast { 
 
   
    //使用此静态方法抛出自定义异常 
    public static void cast(ResultCode resultCode) { 
 
   
        throw new CustomException(resultCode);
    }
}

5.3.3 异常捕获类

  1. 代码示例
public class ExceptionCatch { 
 
   
    //捕获 CustomException异常 
    @ExceptionHandler(CustomException.class)
    @ResponseBody
    public ResponseResult customException(CustomException e) { 
 
   
        ResultCode resultCode = e.getResultCode();
        ResponseResult responseResult = new ResponseResult(resultCode);
        return responseResult;
    }
}

本文同步分享在 博客“cwl_java”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。服务器

相关文章
相关标签/搜索