• 异常处理


    1.SpringBoot2.x配置全局异常实战
      讲解:服务端异常讲解和SpringBoot配置全局异常实战

      1、默认异常测试 int i = 1/0,不友好

      2、异常注解介绍
      @ControllerAdvice 如果是返回json数据 则用 RestControllerAdvice,就可以不加 @ResponseBody
      若使用@ControllerAdvice,则需要添加 @ResponseBody
      //捕获全局异常,处理所有不可知的异常
      @ExceptionHandler(value=Exception.class)

    代码示例:

    ExceptionController.java:

     1 package net.xdclass.demo.controller;
     2 
     3 import java.io.File;
     4 import java.io.IOException;
     5 import java.util.Date;
     6 import java.util.UUID;
     7 
     8 import javax.servlet.http.HttpServletRequest;
     9 
    10 import net.xdclass.demo.domain.JsonData;
    11 import net.xdclass.demo.domain.User;
    12 
    13 import org.springframework.beans.factory.annotation.Value;
    14 import org.springframework.context.annotation.PropertySource;
    15 import org.springframework.stereotype.Controller;
    16 import org.springframework.web.bind.annotation.RequestMapping;
    17 import org.springframework.web.bind.annotation.RequestParam;
    18 import org.springframework.web.bind.annotation.ResponseBody;
    19 import org.springframework.web.bind.annotation.RestController;
    20 import org.springframework.web.multipart.MultipartFile;
    21 
    22 @RestController
    23 public class ExceptionController {
    24 
    25     @RequestMapping(value = "/api/v1/test_ext")
    26     public Object index() {
    27         int i = 1/0;
    28         return new User(11, "asddasf", "123456", new Date());
    29     }
    30 
    31 }

    CustomExtHandler.java:

     1 package net.xdclass.demo.domain;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 
     8 import org.slf4j.Logger;
     9 import org.slf4j.LoggerFactory;
    10 import org.springframework.web.bind.annotation.ControllerAdvice;
    11 import org.springframework.web.bind.annotation.ExceptionHandler;
    12 import org.springframework.web.bind.annotation.ResponseBody;
    13 import org.springframework.web.bind.annotation.RestControllerAdvice;
    14 
    15 
    16 @RestControllerAdvice
    17 public class CustomExtHandler {
    18 
    19     private static final Logger LOG = LoggerFactory.getLogger(CustomExtHandler.class);
    20 
    21     
    22     //捕获全局异常,处理所有不可知的异常
    23     @ExceptionHandler(value=Exception.class)
    24     //@ResponseBody
    25     Object handleException(Exception e,HttpServletRequest request){
    26         LOG.error("url {}, msg {}",request.getRequestURL(), e.getMessage()); 
    27         Map<String, Object> map = new HashMap<>();
    28             map.put("code", 100);
    29             map.put("msg", e.getMessage());
    30             map.put("url", request.getRequestURL());
    31             return map;
    32     }
    33 }

    访问:http://localhost:8083/api/v1/test_ext

    在浏览器中查看后台返回的json数据:

     

    2、SpringBoot2.x配置全局异常返回自定义页面
      简介:使用SpringBoot自定义异常和错误页面跳转实战

      1、返回自定义异常界面,需要引入thymeleaf依赖
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>


      2、resource目录下新建templates,并新建error.html
      ModelAndView modelAndView = new ModelAndView();
      modelAndView.setViewName("error.html");
      modelAndView.addObject("msg", e.getMessage());
      return modelAndView;

      代码示例1——进行页面跳转:

      MyException.java:

     1 package net.xdclass.demo.domain;
     2 
     3 /**
     4  * 功能描述:自定义异常类
     5  *
     6  */
     7 public class MyException extends RuntimeException {
     8 
     9     public MyException(String code, String msg) {
    10         this.code = code;
    11         this.msg = msg;
    12     }
    13 
    14     private String code;
    15     private String msg;
    16     public String getCode() {
    17         return code;
    18     }
    19     public void setCode(String code) {
    20         this.code = code;
    21     }
    22     public String getMsg() {
    23         return msg;
    24     }
    25     public void setMsg(String msg) {
    26         this.msg = msg;
    27     }
    28 
    29 }

      CustomExtHandler.java:

     1 package net.xdclass.demo.domain;
     2 
     3 import java.util.HashMap;
     4 import java.util.Map;
     5 
     6 import javax.servlet.http.HttpServletRequest;
     7 
     8 import org.slf4j.Logger;
     9 import org.slf4j.LoggerFactory;
    10 import org.springframework.web.bind.annotation.ExceptionHandler;
    11 import org.springframework.web.bind.annotation.RestControllerAdvice;
    12 import org.springframework.web.servlet.ModelAndView;
    13 
    14 
    15 @RestControllerAdvice
    16 public class CustomExtHandler {
    17 
    18     private static final Logger LOG = LoggerFactory.getLogger(CustomExtHandler.class);
    19 
    20     
    21     //捕获全局异常,处理所有不可知的异常
    22     @ExceptionHandler(value=Exception.class)
    23     Object handleException(Exception e,HttpServletRequest request){
    24         LOG.error("url {}, msg {}",request.getRequestURL(), e.getMessage()); 
    25         Map<String, Object> map = new HashMap<>();
    26             map.put("code", 100);
    27             map.put("msg", e.getMessage());
    28             map.put("url", request.getRequestURL());
    29             return map;
    30     }
    31     
    32     
    33 
    34     /**
    35      * 功能描述:处理自定义异常
    36      * @return
    37      */
    38     @ExceptionHandler(value=MyException.class)
    39     Object handleMyException(MyException e,HttpServletRequest request){
    40         //进行页面跳转
    41         ModelAndView modelAndView = new ModelAndView();
    42         modelAndView.setViewName("error.html");
    43         modelAndView.addObject("msg", e.getMessage());
    44         return modelAndView;
    45 
    46     }
    47      
    48     
    49 }

    浏览器访问:http://localhost:8083/api/v1/myext

    结果:

      执行流程:

       先访问controller,controller抛出异常,被CustomExtHandler.java中的@RestControllerAdvice监听到,根据异常的种类找到对应的Handler。

      代码示例2——返回json数据:

     1     /**
     2      * 功能描述:处理自定义异常
     3      * @return
     4      */
     5     @ExceptionHandler(value=MyException.class)
     6     Object handleMyException(MyException e,HttpServletRequest request){
     7         
     8         //返回json数据,由前端去判断加载什么页面(通常用作前后端分离开发)
     9         Map<String, Object> map = new HashMap<>();
    10         map.put("code", e.getCode());
    11         map.put("msg", e.getMsg());
    12         map.put("url", request.getRequestURL());
    13         return map;

      结果:

      

      https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/reference/htmlsingle/#boot-features-error-handling

  • 相关阅读:
    Linux系统根目录各文件夹的含义
    openstack与VMware workStation的区别
    VMWare的网络
    VMware Workstation 的安装和使用
    Jmeter简介
    加快建设创新型国家
    c语言指针详解
    [翻译]NUnit--前言(一)
    [翻译]NUnit--Getting Started(二)
    [测试]单元测试框架NUnit
  • 原文地址:https://www.cnblogs.com/116970u/p/10235878.html
Copyright © 2020-2023  润新知