springboot 异常处理-自定义异常及拦截异常

ゝ一纸荒年。 2022-04-15 06:46 799阅读 0赞

一般解决异常的思路如下

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzk0MjY2_size_16_color_FFFFFF_t_70

这里我就主要讲讲自定义异常的拦截

为什么要抛自定义异常?

1.service方法在执行过程出现异常在哪捕获?在service中需要都加try/catch,如果在controller也需要添加
try/catch,代码冗余严重且不易维护。

2.在统一异常处理类中去捕获异常,无需controller捕获异常,向用户返回统一规范的响应信息

3.将异常以json 数据格式返回,

2.自定义信息响应接口

1.创建一个异常响应接口,需要抛出异常的时候写个继承类就行…

  1. public interface ResultCode {
  2. //操作是否成功,true为成功,false操作失败
  3. boolean success();
  4. //操作代码
  5. int code();
  6. //提示信息
  7. String message();
  8. }

3.自定义异常类

  1. public class CustomException extends RuntimeException {
  2. private ResultCode resultCode;
  3. // 重写构造
  4. public CustomException(ResultCode resultCode){
  5. //异常信息为错误代码+异常信息
  6. super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
  7. this.resultCode = resultCode;
  8. }
  9. //提供获取异常信息的方法
  10. public ResultCode getResultCode() {
  11. return resultCode;
  12. }
  13. }

创建一个抛出异常的工具类

  1. //抛出异常的工具类
  2. public class ExceptionCast {
  3. public static void cast(ResultCode resultCode){
  4. throw new CustomException(resultCode);
  5. }
  6. }

4 . 创建异常捕获类

  1. @ControllerAdvice
  2. public class ExceptionCatch {
  3. //日志打印类
  4. private static final Logger LOGGER = LoggerFactory.getLogger(ExceptionCatch.class);
  5. //捕获 CustomException异常
  6. @ExceptionHandler(CustomException.class)
  7. @ResponseBody //响应json数据
  8. public ResponseResult customException(CustomException e){
  9. // 打印日志 e.getMessage() 打印自定义抛出的异常信息 也就是 这句 super("错误代码:"+resultCode.code()+"错误信息:"+resultCode.message());
  10. LOGGER.error("catch exception : {}\r\nexception: ",e.getMessage(), e);
  11. //获取详细的信息
  12. ResultCode resultCode = e.getResultCode();
  13. //创建响应类,也就是最终传给页面的数据
  14. ResponseResult response = new ResponseResult(resultCode);
  15. return response;
  16. }
  17. }

//创建响应类,也就是最终传给页面的数据
ResponseResult response = new ResponseResult(resultCode); 其实就是对数据的封装

  1. public ResponseResult(ResultCode resultCode){
  2. this.success = resultCode.success();
  3. this.code = resultCode.code();
  4. this.message = resultCode.message();
  5. }

5.异常测试处理

  1. 异常类的创建

    这里使用的是枚举类型,当然也可以用普通class 实现接口

    public enum CmsCode implements ResultCode {

    1. CMS_ADDPAGE_EXISTSNAME(false,24001,"页面名称已存在!"),
    2. CMS_GENERATEHTML_DATAURLISNULL(false,24002,"从页面信息中找不到获取数据的url!"),
    3. CMS_GENERATEHTML_DATAISNULL(false,24003,"根据页面的数据url获取不到数据!"),
    4. CMS_GENERATEHTML_TEMPLATEISNULL(false,24004,"页面模板为空!"),
    5. CMS_GENERATEHTML_HTMLISNULL(false,24005,"生成的静态html为空!"),
    6. CMS_GENERATEHTML_SAVEHTMLERROR(false,24005,"保存静态html出错!"),
    7. CMS_COURSE_PERVIEWISNULL(false,24007,"预览页面为空!");
    8. //操作代码
    9. boolean success;
    10. //操作代码
    11. int code;
    12. //提示信息
    13. String message;
    14. private CmsCode(boolean success, int code, String message){
    15. this.success = success;
    16. this.code = code;
    17. this.message = message;
    18. }
    19. @Override
    20. public boolean success() {
    21. return success;
    22. }
    23. @Override
    24. public int code() {
    25. return code;
    26. }
    27. @Override
    28. public String message() {
    29. return message;
    30. }
    31. //set get 方法省略

    }

2.项目使用

  1. if(obj !=null){
  2. //校验对象是否存在,已存在则抛出异常
  3. ExceptionCast.cast(CmsCode.CMS_ADDPAGE_EXISTS);
  4. }

可能有些不太了解枚举的同学可能会奇怪怎么这样写,,,,我一开始也是这样,后来发现

  1. CmsCode.CMS_ADDPAGE_EXISTS // 这句代码

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwNzk0MjY2_size_16_color_FFFFFF_t_70 1

以上是我个人的见解,,如果有什么不对的话,欢迎指出 …谢谢

发表评论

表情:
评论列表 (有 0 条评论,799人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Springboot定义异常处理

    背景 Springboot 默认把异常的处理集中到一个ModelAndView中了,但项目的实际过程中,这样做,并不能满足我们的要求。具体的自定义异常的处理,参看以下