springboot------全局异常捕获和自定义异常

玉天恒      2022-04-15     758

关键词:

1.添加Maven依赖

<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>
  <groupId>top.ytheng</groupId>
  <artifactId>springboot-demo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>
  
  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
              <scope>true</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

2.添加自定义异常类

package top.ytheng.demo.domain;

public class MyException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public MyException(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }
    
    private String code;
    private String msg;

    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    
}

3.添加异常处理类

package top.ytheng.demo.domain;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;

//如果返回的是Json格式的数据,
//可以使用@ResponseBody+@ControllerAdvice替换@RestControllerAdvice
@RestControllerAdvice
//@ControllerAdvice
public class CustomExtHandler {
    private static final Logger LOG = LoggerFactory.getLogger(CustomExtHandler.class);
    
    //捕获全局异常,处理所有不可知的异常
    @ExceptionHandler(value=Exception.class)
    //@ResponseBody
    public Object handleException(Exception e, HttpServletRequest request) {
        LOG.error("msg:{},url:{}", e.getMessage(), request.getRequestURL());
        
        Map<String, Object> map = new HashMap<>();
        map.put("code", 100);
        map.put("msg", e.getMessage());
        map.put("url", request.getRequestURL());
        return map;
    }
    
    //自定义异常
    //需要添加thymeleaf依赖
    //路径:src/main/resources/templates/error.html
    @ExceptionHandler(value=MyException.class)
    public Object handleMyException(MyException e, HttpServletRequest request) {
        //返回Json数据,由前端进行界面跳转
        //Map<String, Object> map = new HashMap<>();
        //map.put("code", e.getCode());
        //map.put("msg", e.getMsg());
        //map.put("url", request.getRequestURL());
        //return map;
        
        //进行页面跳转
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName("error.html");
        modelAndView.addObject("msg", e.getMsg());
        return modelAndView;
    }
}

4.添加异常控制器

package top.ytheng.demo.controller;

import java.util.HashMap;
import java.util.Map;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import top.ytheng.demo.domain.MyException;

@RestController
@RequestMapping("/exce")
public class ExceptionController {
    
    @RequestMapping("/api/v1/exce")
    public Object testException() {
        Map<String, Object> map = new HashMap<>();
        map.put("name", "ytheng");
        map.put("pwd", 123456);
        
        int data = 1/0;
        return map;
    }
    
    @RequestMapping("/api/v1/myexce")
    public Object testMyException() {
        
        throw new MyException("500", "my ext异常");
        
    }
}

5.添加启动类

package top.ytheng.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication //等于下面3个
//@SpringBootConfiguration
//@EnableAutoConfiguration
//@ComponentScan
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
    
}

6.添加文件配置application.properties

#端口号
server.port=8090

#当前项目根目录下创建爱你日志文件
logging.file=C:\\Users\\tianheng\\eclipse-workspace\\springboot.log

7.添加error.html界面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h1>错误信息界面</h1>
</body>
</html>

8.右键Run As启动项目,访问地址

http://localhost:8090/exce/api/v1/exce
http://localhost:8090/exce/api/v1/myexce

 

另附:

 

springboot中添加全局异常捕获类

前几天工作中遇到一个项目,前后端分离的,作为后端开发专注开发接口。对于程序中出现的异常如果不进行处理,将报错信息直接返回到前端十=时不优雅的,因此需要对异常进行捕获和处理,但是每个接口都单独处理异常则... 查看详情

springboot全局捕获异常

捕获捕获原理,使用AOP技术,采用异常通知。1.捕获返回json格式2.捕获返回页面步骤:[email protected](pasePackage="")注释异常处理类[email protected](RuntimeException.class)拦截的异常类型,注释方法 查看详情

springboot全局异常捕获

@ControllerAdvice//定义为切面拦截所有publicclassGlobalExceptionHandler{@ExceptionHandler(RuntimeException.class)@ResponseBody//拦截返回是json返回结果publicMap<String,Object>exceptionHandler(){Map<String,Object 查看详情

springboot全局异常捕获

packagecom.example.demo.Config;importorg.springframework.ui.Model;importorg.springframework.web.bind.WebDataBinder;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframew 查看详情

springboot编程之全局异常捕获(代码片段)

springboot编程之全局异常捕获 1、创建GlobalExceptionHandler.java,在类上注解@ControllerAdvice,在方法上注解@ExceptionHandler(value=Exception.class),Exception.class表示拦截所有的异常信息 packagecom.imooc.web.controller;importcom 查看详情

springboot全局捕获异常处理!

packagecom.htli.util;importjava.util.HashMap;importjava.util.Map;importorg.springframework.web.bind.annotation.ControllerAdvice;importorg.springframework.web.bind.annotation.ExceptionHandler;importorg 查看详情

springboot(十九)@controlleradvice+@exceptionhandler全局捕获controller异常

在spring3.2中,新增了@ControllerAdvice注解,可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。@ControllerAdvice官方文档。创建全局异常处理类:通过使用@ControllerAdvice定义统一的异常处理类,而不是在... 查看详情

springboot:globaldefaultexceptionhandler方法内的友好错误提示,全局异常捕获

springboot:GlobalDefaultExceptionHandler方法内的友好错误提示,全局异常捕获当你的某个控制器内的某个方法报错,基本上回显示出java错误代码,非常不友好,这个时候可以通过新建GlobalDefaultExceptionHandler.java文件,1.加上@ControllerAdvice注解... 查看详情

spring--springboot配置全局异常处理器

一、为什么要使用全局异常处理器?什么是全局异常处理器?就是把错误异常统一处理的方法。应用场景:1、当你使用jsr303参数校验器,如果参数校验不通过会抛异常,而且无法使用try-catch语句直接捕获,这时可以使用全局异... 查看详情

java中的全局异常处理(代码片段)

Java中的全局异常处理全局异常处理SpringBoot的全局异常处理@ControllerAdvice注解全局异常处理ErrorController接口和@ControllerAdvice注解比较:相同点:两者都是Spring项目中的全局异常处理方式不同点:捕获异常位置不同:ErrorController接口... 查看详情

java中的全局异常处理(代码片段)

Java中的全局异常处理全局异常处理SpringBoot的全局异常处理@ControllerAdvice注解全局异常处理ErrorController接口和@ControllerAdvice注解比较:相同点:两者都是Spring项目中的全局异常处理方式不同点:捕获异常位置不同:ErrorController接口... 查看详情

java中的全局异常处理(代码片段)

Java中的全局异常处理全局异常处理SpringBoot的全局异常处理@ControllerAdvice注解全局异常处理ErrorController接口和@ControllerAdvice注解比较:相同点:两者都是Spring项目中的全局异常处理方式不同点:捕获异常位置不同:ErrorController接口... 查看详情

springboot全局异常处理

 新建包com.chy.exception,包下新建类GlobalExceptionHandler:@ControllerAdvice//controller的增强publicclassGlobalExceptionHandler{@ExceptionHandler(Exception.class)//给controller添加异常处理,括号中指定要捕获处理哪种异常,Exception. 查看详情

springboot2.x:全局异常处理

前言在JavaWeb系统开发中,不管是Controller层、Service层还是Dao层,都有可能抛出异常。如果在每个方法中加上各种trycatch的异常处理代码,那样会使代码非常繁琐。在SpringMVC中,我们可以将所有类型的异常处理从各个单独的方法中... 查看详情

springboot捕获全局异常404-nohandlerfoundexception及swagger/静态路由处理

1、解决SpringMVCnohandler抛出异常-简书(jianshu.com)https://www.jianshu.com/p/80e7b7fc374e现如今每一个网站都会有自己的404页面,但是作为一个纯后端的应用,肯定是没有静态资源的,这辈子也不可能会有静态资源对于SpringMVC它有... 查看详情

全局response对象和全局异常捕获和日志(代码片段)

全局Response对象和全局异常捕获和日志1.全局Response对象fromrest_framework.responseimportResponseclassAPIResponse(Response):def__init__(self,code=100,msg=‘成功‘,result=None,error=None,status=None,headers=None,content_type= 查看详情

重学springboot系列之统一全局异常处理(代码片段)

重学SpringBoot系列之统一全局异常处理设计一个优秀的异常处理机制异常处理的乱象例举该如何设计异常处理开发规范自定义异常和相关数据结构该如何设计数据结构枚举异常的类型自定义异常请求接口统一响应数据结构使用示... 查看详情

从零开始学习springboot(全局异常捕捉)

 1.新建一个类 在类上加上@ControllerAdvice注解,方法上加@ExceptionHandler(value=Exception.class)注解 2.写一个有异常的方法在控制台打印出捕获的异常:  查看详情