• (022)Spring Boot之异常处理的两种方式


      第一种方式,实现ErrorPageRegistrar接口,指定异常状态码或者异常类和对应的跳转页面,如下:

      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>
    
        <groupId>com.edu.spring</groupId>
        <artifactId>springboot_web</artifactId>
        <version>1.0.0</version>
    
        <name>springboot_web</name>
        <!-- FIXME change it to the project's website -->
        <url>http://www.example.com</url>
        <parent> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-parent</artifactId> 
            <version>2.0.4.RELEASE</version> 
        </parent>
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
        </dependencies>
    
    </project>
    View Code

      CommonErrorPageRegistrar.java,实现ErrorPageRegistrar接口,并且装配到spring容器中

    package com.edu.spring.springboot;
    
    import org.springframework.boot.web.server.ErrorPage;
    import org.springframework.boot.web.server.ErrorPageRegistrar;
    import org.springframework.boot.web.server.ErrorPageRegistry;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    
    @Component
    public class CommonErrorPageRegistrar implements ErrorPageRegistrar{
    
        @Override
        public void registerErrorPages(ErrorPageRegistry registry) {
            
            ErrorPage e404=new ErrorPage(HttpStatus.NOT_FOUND,"/404.html");
            ErrorPage e500=new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR,"/500.html");
            ErrorPage args=new ErrorPage(IllegalArgumentException.class,"/args.html");
            ErrorPage nullpoint=new ErrorPage(NullPointerException.class,"/nullpoint.html");
    
            registry.addErrorPages(e404,e500,args,nullpoint);
        }
    
        
    }
    View Code

      异常跳转页面如下:

       UserController.java测试类

    package com.edu.spring.springboot;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
        
        @RequestMapping("/user/innererror")
        public String innererror(){
            System.out.println("============innererror=============");
            int a=10/0;
            return "innererror" +a;
        }
    
        @RequestMapping("/user/index")
        public String index(){
            System.out.println("============index=============");
            throw new IllegalArgumentException("IllegalArgumentException抛出的异常");
        }
        
        @RequestMapping("/user/empty")
        public String empty(){
            System.out.println("============empty=============");
            throw new NullPointerException("NullPointerException抛出的异常");
        }
    }
    View Code

      App.java,排除掉默认的处理类:ErrorMvcAutoConfiguration(高版本不用排除,本示例可以不排除)

    package com.edu.spring.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
    
    @SpringBootApplication(exclude=ErrorMvcAutoConfiguration.class)
    public class App 
    {
        public static void main(String[] args) {
             SpringApplication.run(App.class, args);
        }
    }
    View Code

      浏览器输入:http://localhost:8080/user/aaa ,该url不存在,跳转404页面,如下:

       浏览器输入:http://localhost:8080/user/innererror ,跳转500页面,如下:

       浏览器输入:http://localhost:8080/user/index ,跳转args页面,如下:

       浏览器输入:http://localhost:8080/user/empty ,跳转空指针页面,如下:

       假如程序抛出的异常满足多个匹配,到底匹配会匹配哪个,尚未看源码。

      第二种方式,使用@ControllerAdvice、@ExceptionHandler注解,如下

      BookController.java

    package com.edu.spring.springboot;
    
    import java.io.FileNotFoundException;
    
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class BookController {
    
        @ExceptionHandler(value=Exception.class)
        public String error(Exception e){
            return "found exception:"+e.getMessage();
        }
        
        @RequestMapping("/book/error1")
        public String error1 () throws FileNotFoundException{
            throw new FileNotFoundException(" book.txt not found");
        }
        
        @RequestMapping("/book/error2")
        public String error2 () throws ClassNotFoundException{
            throw new ClassNotFoundException(" Book class not found");
        }
    }
    View Code

      UserController.java

    package com.edu.spring.springboot;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class UserController {
    
        @RequestMapping("/user/index")
        public String index(){
            System.out.println("============index=============");
            throw new IllegalArgumentException("IllegalArgumentException抛出的异常");
        }
    }
    View Code

      GlobalExceptionHandler.java

    package com.edu.spring.springboot;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(value=Exception.class)
        @ResponseBody
        public String error(Exception e){
            return "global exception:"+e.getClass().getName();
        }
    }
    View Code

      App.java

    package com.edu.spring.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class App 
    {
        public static void main(String[] args) {
             SpringApplication.run(App.class, args);
        }
    }
    View Code

      浏览器输入:http://localhost:8080/book/error1 ,被方法所在类中的@ExceptionHandler注解捕获,如下:

       浏览器输入:http://localhost:8080/book/error2 ,被方法所在类中的@ExceptionHandler注解捕获,如下:

       浏览器输入:http://localhost:8080/user/index ,被全局异常类GlobalExceptionHandler中的@ExceptionHandler注解捕获,如下:

       说明:程序抛出的异常优先在本类中处理,如果本类中没有处理的方法,则全局异常会处理

  • 相关阅读:
    Tomcat:基础安装和使用教程
    java部署
    tomcat 配置访问路径 server.xml配置去掉项目名称 .
    linuxACL控制
    Your PHP installation appears to be missing the MySQL
    ssh报错
    502 Bad Gateway
    单点登录SSO
    tomcat详细介绍
    详解redis5.x版本
  • 原文地址:https://www.cnblogs.com/javasl/p/11966655.html
Copyright © 2020-2023  润新知