SpringBoot(异常处理)

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.处理方式
  • 自定义异常跟其他异常一样,也可以通过默认异常处理机制或全局异常处理机制来处理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

测试环境搭建整套大数据系统(十一:docker部署superset,无密码登录嵌入html,http改为https)

一&#xff1a;安装docker 参考文档 https://blog.csdn.net/weixin_43446246/article/details/136554243 二&#xff1a;安装superset 下载镜像。 拉取镜像&#xff08;docker pull amancevice/superset&#xff09; 查看镜像是否下载完成&#xff08;docker images&#xf…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:RichText)

富文本组件&#xff0c;解析并显示HTML格式文本。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。该组件无法根据内容自适应设置宽高属性&#xff0c;需要开发者设置显示布局。 子组件 不包含子组…

广度优先算法(一篇文章讲透)

目录 引言 一、算法概述 二、算法步骤 1 初始化 2 循环处理 三、算法应用 1 图的最短路径问题 2 网络爬虫 3 社交网络分析 4 游戏路径搜索 事例 四、算法特点与性能 五、性能优化 1 剪枝策略&#xff1a; 2 使用高效的数据结构&#xff1a; 3 并行化处理&#…

Machine Vision Technology:Lecture6 Blob detection斑点检测

Machine Vision Technology&#xff1a;Lecture6 Blob detection斑点检测 Blob detectionAchieving scale covarianceRecall&#xff1a;Edge detectionScale selectionBlob detection in 2DCharacteristic scale特征尺度Scale-space blob detectorEfficient implementation&am…

webconfig-boot项目说明

1、前言 最近利用空余时间写了一个项目webconfig-boot 。该项目主要配置了web项目常用的一些配置&#xff0c;如统一参数校验、统一异常捕获、统一日期的处理、常用过滤器、常用注解等。引入依赖接口完成常规的web配置。 这里也是总结了笔者在项目开发中遇到的一些常用的配置…

C语言葵花宝典之——文件操作

前言&#xff1a; 在之前的学习中&#xff0c;我们所写的C语言程序总是在运行结束之后&#xff0c;就会自动销毁&#xff0c;那如果我们想将一个结果进行长期存储应该如何操作呢&#xff1f;这时候就需要我们用文件来操作。 目录 1、什么是文件&#xff1f; 1.1 程序文件 1.2…

2024年AI辅助研发:科技创新的引擎

CSND - 个人主页&#xff1a;17_Kevin-CSDN博客 收录专栏&#xff1a;《人工智能》 技术进展 进入2024年&#xff0c;人工智能&#xff08;AI&#xff09;在科技界和工业界的焦点地位更加巩固&#xff0c;其在辅助研发领域的技术进步尤为显著。深度学习技术的突飞猛进使得数据分…

Window API 使用的一些注意事项

文章目录 1、LPCWSTR类型2、LPCTSTR类型3、LPCSTR类型4、LPCTSTR和LPCWSTR区别5、LPCTSTR和LPCSTR、LPCWSTR三者区别6、_T(" ")7、DWORD类型转换为std::wstring类型8、char类型转换为LPCSTR类型9、获取当前时间戳(毫秒)10、std::wstring和LPCSTR区别11、std::wstring…

漫途桥梁结构安全监测方案,护航桥梁安全!

桥梁作为城市生命线的重要组成部分&#xff0c;承载着城市交通、物流输送、应急救援等重要职能。然而&#xff0c;随着我国社会经济的飞速发展&#xff0c;桥梁所承载的交通流量逐年增长&#xff0c;其安全性所面临的挑战亦日益严峻。例如恶劣的外部环境、沉重的荷载以及长期使…

南大通用数据库-Gbase-8a-学习-43-SQL长时间处于Writing to net状态排查

目录 一、问题截图 二、排查思路 1、Gbase8a SQL有几种状态 2、问题导致原因猜想 3、观察服务端&#xff08;集群端&#xff09;网络情况 4、观察客户端网络情况 5、排查客户端程序处理数据慢 5.1、send &#xff08;1&#xff09;声明 &#xff08;2&#xff09;作用…

springboot“期待相遇”图书借阅系统的设计与实现

摘 要 伴随着我国社会的发展&#xff0c;人民生活质量日益提高。于是对系统进行规范而严格是十分有必要的&#xff0c;所以许许多多的信息管理系统应运而生。此时单靠人力应对这些事务就显得有些力不从心了。所以本论文将设计一套“期待相遇”图书借阅系统&#xff0c;帮助商家…

TS的el-tree数据处理方式,递归

private async initData() {let res await GetAllOranizationInfo()console.log(res数据, res)//获取递归方法return回来的数据this.treeData this.organData(res, null)console.log(tree数据, this.treeData)} private organData(allData: any[], topparentId: string): Tr…

智慧交通:构建智慧城市的重要一环

随着信息技术的飞速发展&#xff0c;智慧城市已成为现代城市发展的重要方向。作为智慧城市的重要组成部分&#xff0c;智慧交通以其高效、便捷、环保的特性&#xff0c;成为推动城市现代化进程的关键力量。本文将从智慧交通的概念、发展现状、面临挑战以及未来趋势等方面&#…

蓝桥杯单片机快速开发笔记——独立键盘

一、原理分析 二、思维导图 三、示例框架 #include "reg52.h" sbit S7 P3^0; sbit S6 P3^1; sbit S5 P3^2; sbit S4 P3^3; void ScanKeys(){if(S7 0){Delay(500);if(S7 0){while(S7 0);}}if(S6 0){Delay(500);if(S6 0){while(S6 0)…

GaN HEMTs在电力电子应用中的交叉耦合与基板电容分析与建模

来源&#xff1a;Analysis and Modeling of Cross-Coupling and Substrate Capacitances in GaN HEMTs for Power-Electronic Applications&#xff08; TED 17年&#xff09; 摘要 本文提出了一种考虑了基板电容与场板之间交叉耦合效应的场板AlGaN/GaN高电子迁移率晶体管(HE…

TOP-K问题

TOP-K问题&#xff1a;即求数据结合中前K个最大的元素或者最小的元素&#xff0c;一情况下数据量都比较大。 比如&#xff1a;专业前10名、世界500强、富豪榜、游戏中前100的活跃玩家等。 对于Top-K问题&#xff0c;能想到的最简单直接的方式就是排序&#xff0c;但是&#x…

Python-sklearn-diabetes项目实战

目录 1 下载数据集和预处理 1.1 加载/下载数据集 1.2 数据可视化 1.3 数据清洗 1.4 特征工程 1.5 构建特征集和标签集 1.6 拆分训练集和测试集 2 训练模型 2.1 选择算法和确定模型 2.2 训练拟合模型 3 评估并优化模型性能 本文以糖尿病数据集diabetes为基础进行线性…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式&#xff0c;它允许开发者使用不同的标准来过滤一组对象&#xff0c;并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制&#xff0c;这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

数据指标体系方法—OSM模型

了解 OSM 模型 OSM 模型&#xff0c;全称为 Object-Strategy-Measure 模型。 O 代表业务目标&#xff0c;不仅仅是指公司战略级别的目标&#xff0c;也包含了产品中某个功能的目的&#xff0c;某场活动的目标等。S 代表业务策略&#xff0c;这里指的是要实现 O 需要采用的策略…

【Linux】从零开始认识进程 — 前篇

我从来不相信什么懒洋洋的自由。我向往的自由是通过勤奋和努力实现的更广阔的人生。。——山本耀司 从零开始认识进程 1 认识冯诺依曼体系2 操作系统3 进程3.1 什么是进程&#xff1f;&#xff1f;&#xff1f;3.2 进程管理PCB 3.3 Linux中的进程深入理解 3.4 进程创建总结 送给…