一, 异常分类
这里的异常分类从系统处理异常的角度看, 主要分类两类: 业务异常和系统异常.
1, 业务异常
业务异常主要是一些可预见性异常, 处理业务异常, 用来提示用户的操作, 提高系统的可操作性.
常见的业务异常提示:
1) 请输入 xxx
2)xxx 不能为空
3)xxx 重复, 请更换
2, 系统异常
系统异常主要是一些不可预见性异常, 处理系统异常, 可以让展示出一个友好的用户界面, 不易给用户造成反感. 如果是一个金融类系统, 在用户界面出现一个系统异常的崩溃界面, 很有可能直接导致用户流失.
常见的系统异常提示:
1) 页面丢失 404
2) 服务器异常 500
二, 解决应用启动后 404 界面
1, 引入页面 Jar 包
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
2, 自定义首页接口
- 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","知了一笑") ;
- return "index";
- }
- }
3, 首页界面
- <!DOCTYPE html>
- <HTML>
- <head lang="en">
- <meta charset="UTF-8" />
- <title>
- </title>
- </head>
- <body>
- <h1 th:text="${name}">
- </h1>
- </body>
- </HTML>
4, 运行效果
三, SpringBoot2.0 中异常处理
1, 项目结构图
2, 自定义业务异常类
- public class ServiceException extends Exception {
- public ServiceException (String msg){
- super(msg);
- }
- }
3, 自定义异常描述对象
- public class ReturnException {
- // 响应码
- private Integer code;
- // 异常描述
- private String msg;
- // 请求的 Url
- private String url;
- // 省略 get set 方法
- }
4, 统一异常处理格式
1) 两个基础注解
@ControllerAdvice 定义统一的异常处理类
@ExceptionHandler 定义异常类型对应的处理方式
2) 代码实现
- 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, 简单的测试接口
- @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("出现异常, 全体卧倒");
- }
- }
四, 源代码地址
GitHub: 知了一笑
https://github.com/cicadasmile/spring-boot-base
来源: http://www.tuicool.com/articles/rmm2YvR