/error
处理所有错误的映射,也就是说当出现错误时,SpringBoot底层会请求转发到 /error 这个映射SpringBoot 底层默认由 DefaultErrorViewResolver 处理错误
=> Debug 分析一下
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>logintitle>
head>
<body bgcolor="#CED3FE">
<img src="images/1.GIF"/>
<hr/>
<div style="text-align: center">
<h1>4o4 Not Foundh1>
<a href='#' th:href="@{/}">返回主页面a>
状态码: <h1 th:text="${status}">h1> <br/>
错误信息: <h1 th:text="${error}">h1>
div>
<hr/>
body>
html>
package com.xjs.springboot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @Author: 谢家升
* @Version: 1.0
*/
@Controller
public class MyErrorController {
//模拟服务器内部错误 500
@GetMapping("/err")
public String err() {
int i = 10 / 0;
return "manage";
}
//这里我们配置的是 post方式请求 /err2
//一会 使用get方式请求 /err2 ,这样就会出现一个 405 的客户端错误
@PostMapping("/err2")
public String err2() {
return "manage";
}
}
package com.xjs.springboot.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
/**
* @Author: 谢家升
* @Version: 1.0
*
* @ControllerAdvice : 使用该注解可以标识一个全局异常处理器/对象
* 该全局异常处理器 会被注入到 spring容器
*
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandle {
/**
* 1. 编写方法 处理指定的异常, 比如这里处理 算数异常和空指针异常,可以指定多个异常
* 2. 这里要处理的异常,由程序员指定即可
* 3. Exception e 表示异常发生后,传递过来的异常对象
* 4. Model model 可以将我们的异常信息,放入到 model,并传递给显示页面
*/
@ExceptionHandler({ArithmeticException.class, NullPointerException.class})
public String handleAritException(Exception e, Model model) {
log.info("异常信息={}", e.getMessage());
//这里将发生的异常信息放入到model => request域 , 然后可以在错误页面取出显示
model.addAttribute("msg", e.getMessage());
return "/error/global"; //视图地址
}
}
DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>全局异常title>
head>
<body bgcolor="#CED3FE">
<hr/>
<div style="text-align: center">
<h1>全局异常/错误 发生了!h1><br/>
异常/错误信息: <h1 th:text="${msg}">h1><br/>
<a href="#" th:href="@{/}">返回主页面a>
div>
<hr/>
body>
html>
package com.xjs.springboot.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.HandlerMethod;
/**
* @Author: 谢家升
* @Version: 1.0
*
* @ControllerAdvice : 使用该注解可以标识一个全局异常处理器/对象
* 该全局异常处理器 会被注入到 spring容器
*
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandle {
/**
* 1. 编写方法 处理指定的异常, 比如这里处理 算数异常和空指针异常,可以指定多个异常
* 2. 这里要处理的异常,由程序员指定即可
* 3. Exception e 表示异常发生后,传递过来的异常对象
* 4. Model model 可以将我们的异常信息,放入到 model,并传递给显示页面
*
* ==> 提出问题:如何获取到异常发生的方法 ?
*/
@ExceptionHandler({ArithmeticException.class, NullPointerException.class})
public String handleAritException(Exception e, Model model, HandlerMethod handlerMethod) {
log.info("异常信息={}", e.getMessage());
//这里将发生的异常信息放入到model => request域 , 然后可以在错误页面取出显示
model.addAttribute("msg", e.getMessage());
//得到异常发生的方法是哪个?
log.info("异常发生的方法是={}",handlerMethod.getMethod());
return "/error/global"; //视图地址
}
}
@ResponseStatus
+ 自定义异常response.sendError(statusCode, resolvedReason);
回顾一下自定义异常 ==> 文章链接
package com.xjs.springboot.exception;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
/**
* @Author: 谢家升
* @Version: 1.0
*
* 1. AccessException : 我们自定义的一个异常 ==> 回顾 Java基础
* 2. @ResponseStatus(value = HttpStatus.FORBIDDEN) 表示发生AccessException异常,我们通过http协议返回的状态码是 403
* 3. 这个状态码和自定义异常的对应关系是由程序员来决定[尽量合理设置]
*/
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public class AccessException extends RuntimeException {
//提供一个构造器,可以指定信息
public AccessException(String message) {
super(message);
}
//显示的定义一下无参构造器
public AccessException() {
}
}
package com.xjs.springboot.controller;
import com.xjs.springboot.exception.AccessException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @Author: 谢家升
* @Version: 1.0
*/
@Controller
public class MyErrorController {
//模拟服务器内部错误 500
@GetMapping("/err")
public String err() {
int i = 10 / 0; //模拟算数异常
return "manage";
}
//这里我们配置的是 post方式请求 /err2
//一会 使用get方式请求 /err2 ,这样就会出现一个 405 的客户端错误
@PostMapping("/err2")
public String err2() {
return "manage";
}
//编写方法,模拟一个 AccessException
@GetMapping("/err3")
public String err3(String name) {
//如果用户不是tom , 我们就认为 无权访问
if (!"tom".equals(name)) {
throw new AccessException();
}
return "manage";//视图地址, 请求转发
//return "redirect:/manage.html";
}
}
package com.xjs.springboot.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.method.HandlerMethod;
/**
* @Author: 谢家升
* @Version: 1.0
*
* @ControllerAdvice : 使用该注解可以标识一个全局异常处理器/对象
* 该全局异常处理器 会被注入到 spring容器
*
*/
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandle {
/**
* 1. 编写方法 处理指定的异常, 比如这里处理 算数异常和空指针异常,可以指定多个异常
* 2. 这里要处理的异常,由程序员指定即可
* 3. Exception e 表示异常发生后,传递过来的异常对象
* 4. Model model 可以将我们的异常信息,放入到 model,并传递给显示页面
*
* ==> 提出问题:如何获取到异常发生的方法 ?
*/
@ExceptionHandler({ArithmeticException.class, AccessException.class, NullPointerException.class})
public String handleAritException(Exception e, Model model, HandlerMethod handlerMethod) {
log.info("异常信息={}", e.getMessage());
//这里将发生的异常信息放入到model => request域 , 然后可以在错误页面取出显示
model.addAttribute("msg", e.getMessage());
//得到异常发生的方法是哪个?
log.info("异常发生的方法是={}",handlerMethod.getMethod());
return "/error/global"; //视图地址
}
}