springboot系列教程(三):全局异常映射(含源码)

一、异常分类

这里的异常分类从系统处理异常的角度看,主要分类两类:业务异常和系统异常。

1、业务异常

业务异常主要是一些可预见性异常,处理业务异常,用来提示用户的操作,提高系统的可操作性。常见的业务异常提示:

  • 请输入xxx
  • xxx不能为空
  • xxx重复,请更换

2、系统异常

系统异常主要是一些不可预见性异常,处理系统异常,可以让展示出一个友好的用户界面,不易给用户造成反感。如果是一个金融类系统,在用户界面出现一个系统异常的崩溃界面,很有可能直接导致用户流失。

常见的系统异常提示:

  • 页面丢失404
  • 服务器异常500

二、应用启动后404界面

1、引入页面Jar包

复制代码
<dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-thymeleaf</artifactid>
</dependency>

2、自定义首页接口

java 复制代码
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class IndexController {
    @RequestMapping("/")
    public String index(ModelMap modelMap) {
        modelMap.addAttribute("name","jksadf") ;
        return "index";
    }
}

3、首页界面

html 复制代码
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8" />
    <title></title>
</head>
<body>
<h1 th:text="${name}"></h1>
</body>
</html>

三、异常处理

1、项目结构图

2、自定义业务异常类

java 复制代码
public class ServiceException extends Exception {
    public ServiceException (String msg){
        super(msg);
    }
}

3、自定义异常描述对象

java 复制代码
public class ReturnException {
    // 响应码
    private Integer code;
    // 异常描述
    private String msg;
    // 请求的Url
    private String url;
	// 省略 get set 方法
}

4、统一异常处理格式

两个基础注解

  • @ControllerAdvice 定义统一的异常处理类
  • @ExceptionHandler 定义异常类型对应的处理方式

代码实现

java 复制代码
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
// 异常以Json格式返回 等同 ExceptionHandler + ResponseBody 注解
// @RestControllerAdvice
public class HandlerException {
    /**
     * 自定义业务异常映射,返回JSON格式提示
     */
    @ExceptionHandler(value = ServiceException.class)
    @ResponseBody
    public ReturnException handler01 (HttpServletRequest request,ServiceException e){
        ReturnException returnException = new ReturnException() ;
        returnException.setCode(600);
        returnException.setMsg(e.getMessage());
        returnException.setUrl(String.valueOf(request.getRequestURL()));
        return returnException ;
    }
    /**
     * 服务异常
     */
    @ExceptionHandler(value = Exception.class)
    public ModelAndView handler02 (HttpServletRequest request,Exception e){
        ModelAndView modelAndView = new ModelAndView() ;
        modelAndView.addObject("ExeMsg", e.getMessage());
        modelAndView.addObject("ReqUrl", request.getRequestURL());
        modelAndView.setViewName("/exemsg");
        return modelAndView ;
    }
}

5、简单的测试接口

java 复制代码
@Controller
public class ExeController {
    /**
     *  {
     *    "code": 600,
     *    "msg": "业务异常:ID 不能为空",
     *    "url": "http://localhost:8003/exception01"
     *  }
     */
    @RequestMapping("/exception01")
    public String exception01 () throws ServiceException {
        throw new ServiceException("业务异常:ID 不能为空");
    }

    @RequestMapping("/exception02")
    public String exception02 () throws Exception {
        throw new Exception("出现异常,全体卧倒");
    }
}
相关推荐
蓝澈112120 分钟前
迪杰斯特拉算法之解决单源最短路径问题
java·数据结构
Kali_0727 分钟前
使用 Mathematical_Expression 从零开始实现数学题目的作答小游戏【可复制代码】
java·人工智能·免费
真实的菜32 分钟前
Kafka生态整合深度解析:构建现代化数据架构的核心枢纽
架构·kafka·linq
rzl0238 分钟前
java web5(黑马)
java·开发语言·前端
时序数据说41 分钟前
为什么时序数据库IoTDB选择Java作为开发语言
java·大数据·开发语言·数据库·物联网·时序数据库·iotdb
君爱学习44 分钟前
RocketMQ延迟消息是如何实现的?
后端
guojl1 小时前
深度解读jdk8 HashMap设计与源码
java
guojl1 小时前
营销客群规则引擎
架构
Falling421 小时前
使用 CNB 构建并部署maven项目
后端
guojl1 小时前
深度解读jdk8 ConcurrentHashMap设计与源码
java