三、全局異常Exception的配置


一、首先自定義一個異常攔截器

 1、攔截異常所有 及攔截 Exception異常

package com.cg.demo.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
* 說明:
*
* @auther panhh
* @date 2019/7/12 9:37
*/
@RestControllerAdvice
public class GlobalExceptionHandler {

//捕獲所有異常 獲取內部異常處理類:Exception
private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(value = Exception.class)
public Map excption(Exception e, HttpServletRequest request){

String eMessage = e.getMessage();
StringBuffer url = request.getRequestURL();
System.out.println("ErrorMsg-->"+eMessage);
System.out.println("url-->"+url);

//打印日志
LOG.error("錯誤信息-->"+eMessage+"===請求鏈接--->"+url);

HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("msg",eMessage);
hashMap.put("url",url);

return hashMap;
}
}

2、效果測試

  @Controller

public class ExcTestController {

@RequestMapping("/test")
@ResponseBody
public String test(){
int a = 4/0;
return "test";
}
}

2、攔截器效果(控制台打印)
 

ErrorMsg-->/ by zero
url-->http://localhost:8080/test
2019-07-12 09:59:11.124 ERROR 10096 --- [nio-8080-exec-5] c.c.d.exception.GlobalExceptionHandler : 錯誤信息-->/ by zero===請求鏈接--->http://localhost:8080/test

 3、頁面返回內容:

  {"msg":"/ by zero","url":"http://localhost:8080/test"}

二、自定義一個異常,自定義異常需要自己拋出

 1、自定義一個異常

package com.cg.demo.exception;

import lombok.Data;
import lombok.ToString;

/**
* 說明:
*
* @auther panhh
* @date 2019/7/12 9:36
*/
@Data
@ToString
public class GlobalException extends RuntimeException {

private String msg;
private Integer code;

public GlobalException(String msg, Integer code) {
this.msg = msg;
this.code = code;
}
}

2、異常攔截器攔截方法
  
private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(value = GlobalException.class)
public Map myExcption(GlobalException e, HttpServletRequest request){

String eMessage = e.getMsg();
Integer code = e.getCode();
StringBuffer url = request.getRequestURL();
System.out.println("ErrorMsg-->"+eMessage);
System.out.println("url-->"+url);

//打印日志
LOG.error("錯誤信息-->"+eMessage+"===請求鏈接--->"+url+"錯誤狀態碼--->"+code);

HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("msg",eMessage);
hashMap.put("code",code);
hashMap.put("url",url);

return hashMap;
}

3、測試
(1)  
@Controller
public class ExcTestController {

@RequestMapping("/test")
@ResponseBody
public String test() {
throw new GlobalException("拋出一個自定義異常",4001);
}
}

(2)攔截器打印內容
  

  ErrorMsg-->拋出一個自定義異常
  url-->http://localhost:8080/test
  2019-07-12 10:14:01.155 ERROR 10132 --- [nio-8080-exec-1] c.c.d.exception.GlobalExceptionHandler : 錯誤信息-->拋出一個自定義異常===請求鏈接--->http://localhost:8080/test錯誤狀態碼--->4001

 (3)前台頁面返回

  {"msg":"拋出一個自定義異常","code":4001,"url":"http://localhost:8080/test"}

三、補充,可以自定義一個返回信息枚舉類

  1、自定義一個枚舉類

    

package com.cg.demo.exception;

import lombok.Data;

/**
* 說明:
*
* @auther panhh
* @date 2019/7/12 10:21
*/
public enum ResponseEnum {

SUCCESS(200,"操作成功"),
ERROR(400,"操作失敗"),
;

private Integer code;
private String msg;

ResponseEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}

public Integer getCode() {
return code;
}

public void setCode(Integer code) {
this.code = code;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}
}

2、自定義異常類修改 GlobalException為
    
package com.cg.demo.exception;

import lombok.Data;
import lombok.ToString;

/**
* 說明:
*
* @auther panhh
* @date 2019/7/12 9:36
*/
@Data
@ToString
public class GlobalException extends RuntimeException {

private ResponseEnum responseEnum;

//添加一個構造函數
public GlobalException(ResponseEnum re){
this.responseEnum = re;
}
}

3、異常攔截器攔截方法修改為
  
private static final Logger LOG = LoggerFactory.getLogger(GlobalExceptionHandler.class);

@ExceptionHandler(value = GlobalException.class)
public Map myExcption(GlobalException e, HttpServletRequest request){

ResponseEnum re = e.getResponseEnum();
String eMessage = re.getMsg();
Integer code = re.getCode();
StringBuffer url = request.getRequestURL();

System.out.println("ErrorMsg-->"+eMessage);
System.out.println("code-->"+code);
System.out.println("url-->"+url);

//打印日志
LOG.error("錯誤信息-->"+eMessage+"===請求鏈接--->"+url+"錯誤狀態碼--->"+code);

HashMap<Object, Object> hashMap = new HashMap<>();
hashMap.put("msg",eMessage);
hashMap.put("code",code);
hashMap.put("url",url);

return hashMap;
}

4、異常演示
  (1)、拋出一個異常
    
@Controller
public class ExcTestController {

@RequestMapping("/test")
@ResponseBody
public String test() {
throw new GlobalException(ResponseEnum.ERROR);
}
}
  
(2)、攔截器方法打印的內容
  

    ErrorMsg-->操作失敗
    code-->400
    url-->http://localhost:8080/test
    019-07-12 10:31:06.281 ERROR 4764 --- [nio-8080-exec-1] c.c.d.exception.GlobalExceptionHandler : 錯誤信息-->操作失敗===請求鏈接--->http://localhost:8080/test錯誤狀態碼--->400

  (3)、前台頁面返回內容     

      {"msg":"操作失敗","code":400,"url":"http://localhost:8080/test"}

四、pom.xml文件

  

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.cg.demo</groupId>
<artifactId>some_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>some_demo</name>
<description>Demo project for Spring Boot</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- swagger2 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>

<!-- swagger-ui -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>

<!--Aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>

五、本文到這里就結束了,奮斗越久越划算,工資變成零花錢 ,希望你不忘初心,繼續努力哈!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM