12.springboot中常用的异常处理方式

springboot中常用的异常处理方式

12.springboot中常用的异常处理方式_第1张图片

springboot中既可以用spring中的@ControllerAdvice 进行统一处理,也可以采用springboot中的自定义异常处理方案,springboot中对异常处理有默认的方案,当然我们一般会自定义异常处理方案。

## 一般默认的错误页面:
因为开发者没有明确提供一个 /error 路径,如果开发者提供了 /error 路径 ,这个页面就不会展示出来,不过在 Spring Boot 中,提供 /error 路径实际上是下下策,Spring Boot 本身在处理异常时,也是当所有条件都不满足时,才会去找 /error 路径。那么我们就先来看看,在 Spring Boot 中,如何自定义 error 页面,整体上来说,可以分为两种,一种是静态页面,另一种是动态页面。

优先级:动态详细>静态详细>动态模糊>静态模糊

静态页面

  • 默认路径

    ---static---
    
    ​		---error---
    
    ​			---404.html----       只展示404错误
    
    ​			----4xx.html---- 	  展示400-499错误,文件中如果有404等更明确的,会按照更明确地
    

动态页面

使用页面模板来做,更为灵活。

默认路径也需要在error下!

----templates-----
	----error-----
		----500.html---
DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Titletitle>
head>
<body>
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>动态异常处理title>
head>
<body>
<table border="1">
  <tr>
    <td>pathtd>
    <td th:text="${path}">td>
  tr>
  <tr>
    <td>errortd>
    <td th:text="${error}">td>
  tr>
  <tr>
    <td>messagetd>
    <td th:text="${messages}">td>
  tr>
  <tr>
    <td>timestamptd>
    <td th:text="${timestamp}">td>
  tr>
  <tr>
    <td>statustd>
    <td th:text="${status}">td>
  tr>
table>

body>
html>
body>
html>

12.springboot中常用的异常处理方式_第2张图片

自定义异常(数据)

  • 在源码中我们可以看到 springboot 中关于异常的五条数据的定义:

    @Override
    public Map<String, Object> getErrorAttributes(ServerRequest request,
                    boolean includeStackTrace) {
           
            Map<String, Object> errorAttributes = new LinkedHashMap<>();
            errorAttributes.put("timestamp", new Date());
            errorAttributes.put("path", request.path());
            Throwable error = getError(request);
            HttpStatus errorStatus = determineHttpStatus(error);
            errorAttributes.put("status", errorStatus.value());
            errorAttributes.put("error", errorStatus.getReasonPhrase());
            errorAttributes.put("message", determineMessage(error));
            handleException(errorAttributes, determineException(error), includeStackTrace);
            return errorAttributes;
    }
    

    如果开发者没有自己提供一个 ErrorAttributes 的实例的话,那么 Spring Boot 将自动提供一个ErrorAttributes 的实例,也就是 DefaultErrorAttributes 。

  • 开发者自定义 ErrorAttributes 有两种方式 :

    1. 直接实现 ErrorAttributes 接口
    2. 继承 DefaultErrorAttributes(推荐),因为 DefaultErrorAttributes 中对异常数据的处理已经完成,开发者可以直接使用。
  • 实现方式:

    @Component
    public class MyErrorAttributes extends DefaultErrorAttributes {
           
        @Override
        public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
           
            Map<String, Object> map = super.getErrorAttributes(webRequest, options);
            if((Integer) map.get("status") == 404){
           
                map.put("message","没有此页面");
    
            }
            return map;
        }
    }
    

自定义异常(视图)不常用,因为springboot提供的已经很够了

你可能感兴趣的:(springboot,2,spring,boot,新星计划)