SpringBoot(异常处理)

news2024/12/22 22:31:57

SpringBoot(异常处理)

1.基本介绍

image-20240316085329050

2.debug异常处理机制

1.找到 DefaultErrorViewResolver

image-20240316091137808

2.下断点

image-20240316091208066

3.debug启动,浏览器输出一个不存在的页面

image-20240316091344713

image-20240316091412058

4.第一次查找 error/404
1.查看目前要找的视图名

image-20240316091630892

2.准备去查找资源

image-20240316091804112

3.准备从四个默认存放静态资源的路径来查找

image-20240316091952997

4.从第一个静态资源的存放路径查找资源即在error目录下的404.html

image-20240316092147256

5.在四个路径下都找不到error/404.html

image-20240316092423196

5.第二次查找 error/4xx
1.准备进行第二次查找

image-20240316092603907

2.这次要查找到error/4xx

image-20240316092731120

3.依然从四个静态路径中查找,可想而知还是查不到

image-20240316092903522

6.如果都查找不到,则创建一个ModelAndView对象返回

image-20240316093218327

7.放行,返回错误页面

image-20240316093300824

3.过滤器和拦截器的区别

1.示意图

image-20240316094128348

2.对请求转发的处理
  • 过滤器不会处理请求转发
  • 拦截器会处理请求转发
3.过滤器和拦截器的执行流程示意图

image-20240316100847578

4.自定义异常页面

1.需求分析

image-20240316101559086

2.具体实现
1.注意事项
1.错误文件放置位置
  • 错误页面的格式是error/404.html或者error/4xx.html
  • 如果使用的模板引擎则放到templates目录下
  • 如果没有使用模板引擎则放到四个默认存放静态资源的目录下即可
2.错误页面可以获取的错误信息(request域中)

image-20240316110503393

2.在templates目录下存放几个错误页面

image-20240316104755159

3.404.html 取出错误信息
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>404</h1>
状态码<h2 th:text="${status}"></h2>
错误信息<h2 th:text="${error}"></h2>
</body>
</html>
4.测试

image-20240316105106640

5.MyErrorController.java 测试异常
package com.sun.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 {
    @GetMapping("/err")
    public String err() {
        int i = 10 / 0; //此时的错误是500
        return "sss";
    }

    @PostMapping("/err2") //一会使用get的方式请求err2,这样会出现4开头的客户端错误
    public String err2() {
        return "sss";
    }
}

6.测试

image-20240316105826699

image-20240316105834754

3.过滤器和拦截器在找不到资源下的执行流程

image-20240316103901750

5.全局异常

1.基本说明

image-20240316110706864

2.需求分析

image-20240316110828224

3.具体实现
1.创建一个全局异常处理类 Global.java
package com.sun.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 //处理异常的Controller
@Slf4j
public class Global {
    //编写方法处理指定的异常
    @ExceptionHandler({ArithmeticException.class, NullPointerException.class}) //指定全局处理的异常
    public String handerException(Exception e, Model model) {
        System.out.println("异常信息:" + e.getMessage());
        model.addAttribute("msg", e.getMessage()); //将异常信息放到request域中
        return "/error/global"; //由于目前使用的模板引擎,所以这里返回的结果会通过路径拼接到templates下面的error/global.html
    }
}

2.\resources\templates\error\global.html 处理全局异常的页面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>全局异常</h1>
错误信息:<h2 th:text="${msg}"></h2>
</body>
</html>
3.测试

image-20240316113443411

6.默认异常和全局异常小结(使用模板引擎方式)

1.默认异常执行流程
  1. 出现异常,中央控制器向/error进行请求转发
  2. /error会从静态资源的存放路径(如果是模板引擎就是templates下面)查找对应的异常处理页面(以404为例)
    1. 首先查找error/404.html,返回一个ModelAndView对象
    2. 如果没有查找到就会查找error/4xx.html,返回一个ModelAndView对象
    3. 如果都没有查找到就会返回一个默认的ModelAndView对象
  3. 视图解析器根据得到的ModelAndView将请求转发到指定的异常处理页面
  4. 将异常处理页面响应到浏览器
2.全局异常
  1. 出现异常,优先查看全局异常处理类
  2. 如果里面有方法处理的该类型的异常,则按照方法的逻辑执行
  3. 如果没有则按照默认异常执行流程执行

7.自定义异常

1.基本介绍

image-20240316125807852

2.需求分析

image-20240316130025894

3.具体实现(使用默认异常处理机制)
1.编写自定义异常 AccessException.java
package com.sun.springboot.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

/**
 * @author 孙显圣
 * @version 1.0
 * 自定义异常
 */
@ResponseStatus(HttpStatus.FORBIDDEN) //指定如果发生异常返回的状态码HttpStatus.FORBIDDEN 这里是403
public class AccessException extends RuntimeException { //继承RuntimeException则表示是一个异常类

    //表示可以在抛出异常时,指定异常信息
    public AccessException(String message) {
        super(message);
    }

    //无参构造
    public AccessException() {
    }
}

2.触发自定义异常 MyErrorController.java
package com.sun.springboot.controller;

import com.sun.springboot.exception.AccessException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

/**
 * @author 孙显圣
 * @version 1.0
 */
@Controller
public class MyErrorController {
    //触发自定义的异常
    @GetMapping("/err3")
    public String err3() {
        throw new AccessException("自定义异常被触发!");
    }
}

3.如果使用默认异常处理机制需要在静态资源文件夹下编写异常处理的html,error/403.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>自定义异常被触发</h1>
</body>
</html>
4.浏览器测试

image-20240316132548593

8.SpringBoot异常处理小结

1.异常处理机制的类型
1.默认异常处理机制(明白原理即可)
  • 到中央控制器,请求转发到/error
  • 根据异常的状态码去静态资源下的error/xxx.html找到指定的文件
  • 不论是否找到都会返回一个ModelAndView对象给视图解析器
  • 视图解析器根据这个对象,请求转发到指定的error/xxx.html
  • 将error/xxx.html返回到浏览器
  • 需要注意的是,如果找不到指定的error/xxx.html文件则会返回一个默认创建的ModelAndView对象,最终在浏览器中体现的错误样式就是如下图:

image-20240316093300824

一句话概括默认异常处理机制:根据异常的状态码来找到指定的error/xxx.html文件返回到浏览器

2.全局异常处理机制(掌握!)
  • @ControllerAdvice + @ExceptionHandler({})注解可以创建全局异常处理类
  • 如果出现异常,则优先会查找全局异常处理类中是否能够捕获到指定异常
  • 如果可以捕获则按照捕获到异常的方法来进行异常处理
  • 否则按照默认异常处理机制处理
2.自定义异常
1.编写自定义异常类
  • 继承RuntimeException
  • 在上面加注解@ResponseStatus()指定响应状态码
  • 添加有参构造器可以在抛出该异常时指定异常信息
2.触发自定义异常
  • 直接 throw new 异常类名(“异常信息”);
3.处理方式
  • 自定义异常跟其他异常一样,也可以通过默认异常处理机制或全局异常处理机制来处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1521164.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 FastAPI APIRouter 构建高效的 API

FastAPI 是一个现代的、高性能的 Python Web 框架&#xff0c;它提供了 APIRouter 来帮助组织和管理路由。APIRouter 是一个可用于组织和分组路由的类&#xff0c;使得代码结构更加清晰和可维护。本文将介绍 FastAPI APIRouter 的用法&#xff0c;包括实践案例以及在 IDE 编辑器…

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议(ICBADS 2024)

【商业|数据科学主题会议推荐】2024年商业分析与数据科学国际学术会议&#xff08;ICBADS 2024) 征稿主题 &#xff08;以下主题包括但不限于&#xff09; 多媒体决策 决策理论与决策科学 数字市场设计与运营 降维 电子商务 道德决策 财务分析 群体决策与软件 医疗保…

podman proxy 【podman 代理】

文章目录 方法1: 为当前用户设置环境变量方法2&#xff1a;为 Podman 服务设置配置文件方法3: 为单个 Podman 命令设置代理方法四: 配置 http-proxy.conf 方法1: 为当前用户设置环境变量 您可以为当前用户设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量,Podman 将自动读取这些环境变…

C语言从入门到熟悉------第四阶段

指针 地址和指针的概念 要明白什么是指针&#xff0c;必须先要弄清楚数据在内存中是如何存储的&#xff0c;又是如何被读取的。如果在程序中定义了一个变量&#xff0c;在对程序进行编译时&#xff0c;系统就会为这个变量分配内存单元。编译系统根据程序中定义的变量类型分配…

【项目笔记】java微服务:黑马头条(day04)

文章目录 自媒体文章-自动审核1)自媒体文章自动审核流程2)内容安全第三方接口2.1)概述2.2)准备工作2.3)文本内容审核接口2.4)图片审核接口2.5)项目集成 3)app端文章保存接口3.1)表结构说明3.2)分布式id3.3)思路分析3.4)feign接口 4)自媒体文章自动审核功能实现4.1)表结构说明4.…

linux ffmpeg编译

下载源码 https://ffmpeg.org/ csdn下载源码包 不想编译可以直接下载使用静态版本 https://ffmpeg.org/download.html https://johnvansickle.com/ffmpeg/ 根据cpu类型&#xff0c;下载解压后就可以直接使用了。 linux编译 安装底层依赖 yum install gcc yum isntall …

mysql用存储过程更新表

打开workbench,点击下面的按钮 编写存储过程 CREATE DEFINERrootlocalhost PROCEDURE new_procedure10(IN myId int,IN myTitle varchar(20),IN myContent varchar(20)) BEGIN if myTitle is NULL then select title into myTitle from blog where idmyId; end if; if myC…

学习通刷视频刷题脚本及安装使用过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装插件二、复制脚本文件链接三、启动脚本四、登录学习通&#xff08;切记一倍速就行不然被封哦&#xff09;五、最好先把答题关掉先刷视频 前言 解决学习…

C++中的多值返回:解锁函数返回值的神奇力量

C中的多值返回&#xff1a;解锁函数返回值的神奇力量 在C编程中&#xff0c;有时候我们需要从函数中返回多个值。虽然C中的函数通常只能返回一个值&#xff0c;但有几种技术和惯用法可以实现返回多个值的效果。本文将介绍C中实现多值返回的几种常用方法&#xff0c;包括引用、指…

JavaWeb(p116-p134)

#驱动类名称 spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver #数据库连接的ur1 spring.datasource.urljdbc:mysql://localhost:3306/mybatis #连接数据库的用户名 spring.datasource.usernameroot #连接数据库的密码 spring.datasource.password**********2.1 数…

【分布式websocket 】前端vuex管理客户端消息crud!使用localStorage来存储【第19期】

前言 聊天系统客户端是要存储消息的&#xff0c;因为所有所有的历史消息都从服务器拉的话一方面服务器压力大&#xff0c;另一方面也耗费用户流量。所以客户端存储消息是势在必行的。如何存储呢上一篇文章也写了&#xff0c;大概就是浏览器的话是localStorage或者IndexedDB。然…

029—pandas 遍历行非向量化修改数据

前言 在 pandas 中&#xff0c;向量化计算是指利用 pandas 对象的内置方法和函数&#xff0c;将操作应用到整个数据结构的每个元素&#xff0c;从而在单个操作中完成大量的计算。 但在一些需求中&#xff0c;我们无法使用向量化计算&#xff0c;就需要迭代操作&#xff0c;本例…

【研发日记】Matlab/Simulink技能解锁(二)——在Matlab Function编辑窗口Debug

文章目录 前言 行断点 条件断点 按行步进 Watch Value 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 行断点 当Matlab Function出现异常时&#xff0c;如果能确定大致的代码段&#xff0c;就可以在相应的行上设置一…

AI - 决策树模型

&#x1f914;决策树算法 决策树的思想来源可以追溯到古希腊时期&#xff0c;当时的哲学家们就已经开始使用类似于决策树的图形来表示逻辑推理过程。然而&#xff0c;决策树作为一种科学的决策分析工具&#xff0c;其发展主要发生在20世纪。 在20世纪50年代&#xff0c;美国兰…

如何在CasaOS系统玩客云中安装内网穿透工具实现远程访问内网主机下载资源

文章目录 1. CasaOS系统介绍2. 内网穿透安装3. 创建远程连接公网地址4. 创建固定公网地址远程访问 2月底&#xff0c;玩客云APP正式停止运营&#xff0c;不再提供上传、云添加功能。3月初&#xff0c;有用户进行了测试&#xff0c;局域网内的各种服务还能继续使用&#xff0c;但…

【SpringCloud微服务实战07】Sentinel 服务保护

Sentinel 是阿里巴巴开源的一款微服务流量控制组件。主要作用: 流量控制:避免因瞬间高并发流量而导致服务故障流。超时处理、线程隔离、降级熔断:避免因服务故障引起的雪崩问题。一、Sentinel 安装 1、安装Sentinel控制台,下载jar包并启动:Releases alibaba/Sentinel G…

动态库和静态库的新理解

旧理解(当初理解较浅&#xff0c;今再看到有新发现) 链接&#xff1a; 静态链接库和动态链接库区别_动态链接库和静态链接库的区别-CSDN博客 由于本人不是做架构方面&#xff0c;给大佬打螺丝。长时间的惯性思维就是要使用其他项目的类或者函数&#xff0c;先导出成dll。然后…

分布式调用与高并发处理(二)| Dubbo

文章目录 Dubbo概念_什么是分布式系统单机架构集群架构分布式架构单机、集群和分布式的区别 Dubbo概念_什么是RPCRPC两个作用&#xff1a;常见 RPC 技术和框架&#xff1a; Dubbo概念_简介Dubbo能做什么Dubbo支持的协议 Dubbo概念_核心组件注册中心Registry服务提供者Provider服…

[ C++ ] STL---string类的使用指南

目录 前言&#xff1a; string类简介 string类的常用接口 string类对象的构造函数 string类对象的赋值运算符重载 string类对象的容量操作 string类对象的访问与遍历 [ ] 下标遍历 迭代器遍历 普通迭代器iterator ​编辑 const迭代器const_iterator 反向迭代器rever…

Linux课程_____用户的管理

一、规则 用户至少属于一个组,在创建时如果不指定组,将会创建同名的组 用户只能有一个基本组(主组),但可以隶属于多个附加组 如果一个组作为某用户的基本组,此组将不能被删除 UID: 用户标识 GID: 组的标识 root管理员的uid及gid 都为0 二、用户的配置文件 1./etc/passwd …