什么是异常处理

news2025/3/10 21:32:36

文章目录

  • 异常处理
    • 介绍
    • 自定义异常页面
      • 文档:
      • 自定义异常页面说明
    • 自定义异常页面-应用实例
        • 需求:
        • 代码实现
    • 全局异常
      • 说明
      • 全局异常-应用实例
        • 需求:
        • 代码实现
        • 完成测试
    • 自定义异常
      • 说明
      • 自定义异常-应用实例
        • 需求:
        • 代码实现
        • 完成测试
    • 注意事项
        • 完成测试

异常处理

介绍

  1. 默认情况下,Spring Boot 提供/error 处理所有错误的映射
  2. 对于机器客户端,它将生成JSON 响应,其中包含错误,HTTP 状态和异常消息的详细信息。对于浏览器客户端,响应一个"whitelabel"错误视图,以HTML 格式呈现相同的数据

image-20230816111320819

自定义异常页面

文档:

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.developing-web-applications.spring-mvc.error-handling.error-pages

自定义异常页面说明

1、如何找到这个文档位置, 看下面一步步的指引
https://docs.spring.io/spring-boot/docs/current/reference/html/index.html => a single HTML page=> 8.web => servlet web application => The “Spring Web MVC Framework” => ErrorHandling => Custom Error Pages

image-20230816105738031

image-20230816105919758

自定义异常页面-应用实例

image-20230816110118721

需求:

自定义404.html 500.html 4xx.html 5xx.html 当发生相应错误时,显示自定义的页面信息

image-20230816110154061

image-20230816110205804

image-20230816110218051

代码实现

  1. 创建4 个页面, 这几个页面拷贝即可(这里使用Thymeleaf需要引入命名空间)

image-20230816110251053

创建4xx.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body bgcolor="#CED3FE">
    <img src="images/1.GIF"/>
    <hr/>
    <div style="text-align: center">
        <h1>4xx 发生错误了:)</h1>
        错误状态码: <h1 th:text="${status}"></h1><br/>
        错误信息: <h1 th:text="${error}"></h1><br/>
        <a href='#' th:href="@{/}">返回主页面</a>
    </div>
    <hr/>
    <img src="images/logo.png"/>
</body>
</html>

创建404.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body bgcolor="#CED3FE">
    <img src="images/1.GIF"/>
    <hr/>
    <div style="text-align: center">
        <h1>4o4 Not Found</h1>
        <a href='#' th:href="@{/}">返回主页面</a><br/>
        状态码: <h1 th:text="${status}"></h1><br/>
        错误信息: <h1 th:text="${error}"></h1>
    </div>
    <hr/>
    <img src="images/logo.png"/>
</body>
</html>

创建5xx.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body bgcolor="#CED3FE">
    <img src="images/1.GIF"/>
    <hr/>
    <div style="text-align: center">
        <h1>5xx 发生错误了:)</h1><br/>
        错误状态码: <h1 th:text="${status}"></h1><br/>
        错误信息: <h1 th:text="${error}"></h1><br/>
        <a href='#' th:href="@{/}">返回主页面</a>
    </div>
    <hr/>
    <img src="images/logo.png"/>
</body>
</html>

创建500.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body bgcolor="#CED3FE">
    <img src="images/1.GIF"/>
    <hr/>
    <div style="text-align: center">
        <h1>500 内部服务器出现了问题</h1><br/>
        状态码: <h1 th:text="${status}"></h1><br/>
        错误信息: <h1 th:text="${error}"></h1><br/>
        <a href='#' th:href="@{/}">返回主页面</a>
    </div>
    <hr/>
    <img src="images/logo.png"/>
</body>
</html>
  1. 创建com/nlc/usersys/controller/MyErrorController.java , 用于模拟错误
@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";
    }
}
  1. 完成测试
    ● 需要先登录,再进行测试,否则会被拦截器打回登录页面
    ● 对于/err2 , 使用get 方式去请求,就会生成400 错误, 可以看到4xx.html
    浏览器输入:http://localhost:8080/xx

image-20230816111601624

浏览器输入:http://localhost:8080/err2
image-20230816111631586

浏览器输入:http://localhost:8080/err

image-20230816111735723

全局异常

说明

  1. @ControllerAdvice+@ExceptionHandler 处理全局异常
  2. 底层是ExceptionHandlerExceptionResolver 支持的

全局异常-应用实例

需求:

  1. 演示全局异常使用, 当发生ArithmeticException、NullPointerException 时,不使用默认异常机制匹配的xxx.html , 而是显示全局异常机制指定的错误页面

image-20230816111927257

代码实现

  1. 创建com/nlc/usersys/exception/GlobalExceptionHandler.java
/**
 * @ControllerAdvice: 使用它可以标识一个全局异常处理器/对象
 * 会注入到spring容器
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    //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,可以再错误页面取出显示
        model.addAttribute("msg", e.getMessage());
        //得到异常发生的方法是哪个
        log.info("异常发生的方法是={}", handlerMethod.getMethod());
        return "/error/global"; //视图地址
    }
}
  1. 创建templates/error/global.html
<html lang="en" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta charset="UTF-8">
        <title>全局异常-显示页面</title>
    </head>
    <body bgcolor="#CED3FE">
        <img src="images/1.GIF"/>
        <hr/>
        <div style="text-align: center">
            <h1>全局异常/错误 发生了:)</h1><br/>
            异常/错误信息: <h1 th:text="${msg}"></h1><br/>
            <a href='#' th:href="@{/}">返回主页面</a>
        </div>
        <hr/>
        <img src="images/logo.png"/>
    </body>
</html>

完成测试

浏览器输入:http://localhost:8080/err

image-20230816112455904

自定义异常

说明

  1. 如果Spring Boot 提供的异常不能满足开发需求,程序员也可以自定义异常.
  2. @ResponseStatus+自定义异常
  3. 底层是ResponseStatusExceptionResolver ,底层调用response.sendError(statusCode,resolvedReason);
  4. 当抛出自定义异常后,仍然会根据状态码,去匹配使用x.html 显示

自定义异常-应用实例

需求:

自定义一个异常AccessException, 当用户访问某个无权访问的路径时,抛出该异常,显示自定义异常状态码

代码实现

  1. 创建com/nlc/usersys/exception/AccessException.java
/**
 * AccessException : 我们自定义的一个异常
 * value = HttpStatus.FORBIDDEN: 表示发生AccessException异常,我们通过http协议返回的状态码 403
 * 这个状态码和自定义异常的对应关系是由程序员来决定[尽量合理来设置]
 * 光标在HttpStatus.FORBIDDEN上CTRL+B可以查看源码看它的状态码
 */
//自定义异常,也会根据状态码,匹配到对应的错误页面显示
@ResponseStatus(value = HttpStatus.FORBIDDEN)
public class AccessException extends RuntimeException {
    
    //提供一个构造器,可以指定信息
    public AccessException(String message) {
        super(message);
    }

    //显示的定义一下无参构造器

    public AccessException() {
    }
}

  1. 修改MyErrorController.java
@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();
            throw new AccessException("自定义的AccessException..");
        }
        return "manage";//视图地址, 请求转发
    }
}

完成测试

浏览器http://localhost:8080/err3

image-20230816115843163

注意事项

1.如果我们将自定义异常放入全局异常处理器,会走全局异常处理机制。

2.放入全局异常就是按照Java的异常类型机制处理,不会按照状态码进行处理。

3.可以自己看看显示效果并Debug,也可以自己设置异常信息。

@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {

    //1、编写方法,处理指定异常, 比如我们处理算术异常和空指针异常, 可以指定多个异常
    //2. 这里要处理的异常,由程序员来指定
    //3. Exception e : 表示异常发生后,传递的异常对象
    //4. Model model: 可以将我们的异常信息,放入model,并传递给显示页面

    @ExceptionHandler({ArithmeticException.class, NullPointerException.class,AccessException.class})
    public String handleAritException(Exception e, Model model, HandlerMethod handlerMethod) {

        log.info("异常信息={}", e.getMessage());
        //这里将发生的异常信息放入到model,可以再错误页面取出显示
        model.addAttribute("msg", e.getMessage());
        //得到异常发生的方法是哪个
        log.info("异常发生的方法是={}", handlerMethod.getMethod());
        return "/error/global"; //视图地址
    }
}

完成测试

浏览器http://localhost:8080/err3

(Exception e, Model model, HandlerMethod handlerMethod) {

    log.info("异常信息={}", e.getMessage());
    //这里将发生的异常信息放入到model,可以再错误页面取出显示
    model.addAttribute("msg", e.getMessage());
    //得到异常发生的方法是哪个
    log.info("异常发生的方法是={}", handlerMethod.getMethod());
    return "/error/global"; //视图地址
}

}


#### 完成测试

 浏览器http://localhost:8080/err3

![image-20230816115335703](https://img-blog.csdnimg.cn/img_convert/3aa3a4c9680d246ae99362a27eb69830.png)

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

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

相关文章

DELL PowerEdge R720XD 磁盘RAID及Hot Spare热备盘配置

一台DELL PowerEdge R720XD服务器&#xff0c;需进行磁盘RAID及Hot Spare热备盘配置&#xff0c;本文记录配置过程示例。 一、设备环境 服务器型号&#xff1a;DELL PowerEdge R720XD 硬盘配置&#xff1a;800G硬盘共24块 二、配置计划 1、当前状态&#xff1a;2块盘配置RAID…

C语言 poll多路复用

NAME poll, ppoll - wait for some event on a file descriptor SYNOPSIS #include <poll.h> 函数原型&#xff1a; int poll(struct pollfd *fds, nfds_t nfds, int timeout); #define _GNU_SOURCE /* See feature_test_macros(7) */ …

机器视觉应用开发什么最重要?

&#xff08;QQ群有答疑&#xff09;零基础小白快速上手海康VisionMaster开发系列课程 高级语言在机器视觉就是工具&#xff0c;机器视觉软件&#xff0c;在机器视觉中也是工具&#xff0c;在机器视觉应用开发中&#xff0c;图像处理是最重要的&#xff0c;一切看图像&#xff…

基于IMX6ULLmini的Linux裸机开发系列四:工程文件整理和中断头文件移植

目录 文件整理 修改前 修改后 Makefile修改 中断头文件移植 文件整理 sources目录下分模块存放文件 子模块提供函数声明头文件 include目录下存放sdk移植头文件 sources/common目录存放一些通用工具 sources/project目录存放启动文件和主文件 修改前 修改后 Makefile修…

Nvidia Jetson 编解码开发(2)Jetpack 4.x版本Multimedia API 硬件编码开发--集成encode模块

1. 前言 这里介绍Multimedia API的开发流程 这篇主要介绍如何集成encode模块 2. 版本介绍 使用的Multimedia API版本: Tegra_Multimedia_API_R28.4.0_aarch64 兼容Jetpack4.x 系列版本Jetson(Nano/Tx2/Xavier/Xavier NX) 测试平台: Xavier NX 测试版本: JetPack 4.4 …

导入ERP数据生成子订单

1&#xff0c;在奥迪工装订购单表中开启导入Excel功能&#xff0c;把Excel表格中的数据导入后保存&#xff0c;审核后自动生成新的子订单合同 2&#xff0c;后台审核时触发生成子订单功能的存储过程 3&#xff0c;后台打开存储过程并且修改---》保存 USE [HYData] GO/****** O…

eNSP:VLAN-hybrid实验应用

实验要求&#xff1a; 拓扑图 配置 sw1: [sw1]vlan batch 2 to 6[sw1]int Ethernet 0/0/2 [sw1-Ethernet0/0/2]port link-type access [sw1-Ethernet0/0/2]port default vlan 2 [sw1-Ethernet0/0/2]int e 0/0/4 [sw1-Ethernet0/0/4]port link-ty access [sw1-Ethernet0/0/…

金盘 微信管理平台 getsysteminfo 未授权访问漏洞[2023-HW]

金盘 微信管理平台 getsysteminfo 未授权访问漏洞 一、漏洞描述二、漏洞影响三、网络测绘四、漏洞复现小龙POC检测: 五、 修复建议 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后…

java代码修改后,提交多个分支 git

1、先提交 dev 分支 2、然后切换到 dev02 分支 3、找到对应的日志

概率论与数理统计:第五章:大数定律与中心极限定理

文章目录 Ch5. 大数定律与中心极限定理(一) 依概率收敛(二) 大数定律1.伯努利大数定律2.切比雪夫大数定律3.辛钦大数定律 (三) 中心极限定理1.列维-林德伯格 中心极限定理 &#xff08;独立同分布&#xff0c;不指定具体分布&#xff0c;近似服从于标准正态分布&#xff09;2.德…

【Java】Servlet中的扩展点,ServletContainerInitializer,Listener,Filter

了解一种技术的设计思想&#xff0c;它的生命周期就比不可少&#xff0c;在使用扩展时就非常实用。Spring的扩展点已经在上一篇【【Spring源码】Spring扩展点及顺序_wenchun001的博客-CSDN博客】 Servlet中的扩展点 JavaWeb访问时的流程图 ServletContainerInitializer 在容器…

国标GB28181安防视频平台EasyGBS显示状态正常,却无法播放该如何解决?

国标GB28181视频平台EasyGBS是基于国标GB/T28181协议的行业内安防视频流媒体能力平台&#xff0c;可实现的视频功能包括&#xff1a;实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。国标GB28181视频监控平台部署简单、可拓展性强&#xff0c;支持将…

Mybatis查询数据库返回任意形式的返回结构

Mybatis查询数据库返回任意形式的返回结构 mapper的接口mapper.xml mapper的接口 假如有多个记录&#xff0c;可以将map放到 arraylist里 mapper.xml 主要是通过resultMap定义好映射格式

【C++题解】[2020普及组模拟题]wgy的JX语言

P a r t Part Part 1 1 1 读题 题目描述 w g y wgy wgy发明了 J X JX JX编程语言&#xff0c;在这种编程语言里&#xff0c;只有 这个运算符&#xff0c;可以将某个变量的值增加。 现在输入 a a a&#xff0c; b b b&#xff0c; n n n&#xff0c;请问仅使用 a a a&…

数字人服装布料解算技术服务,让数字人驱动更真实

一个数字人通过三维建模、骨骼绑定、表情绑定后&#xff0c;对于数字人有两种使用场景&#xff0c;可以使用动捕设备实时驱动&#xff0c;将静态的3D模型结合动捕设备实时“活”起来。数字人通过动捕设备实时驱动的过程&#xff0c;则是基于实时布料毛发解算方案进行技术处理的…

从零开发短视频电商 自动化测试WebUI端到端测试-Playwright

文章目录 Playwright是什么Playwright入门示例添加Maven依赖示例代码启动验证 功能自动等待内置Web断言可视化UI模式减慢操作截图录屏脚本录制 高级识别验证码 Playwright是什么 https://playwright.dev/ https://playwright.dev/java/ Playwright为现代 Web 应用程序提供可…

QTreeWidget——信号处理

文章目录 基本属性信号一、信号种类二、信号测试1、currentItemChanged、itemCollapsed、itemExpanded三个信号的测试2、itemActivated信号3、 itemChanged信号4、其余信号的测试代码&#xff08;包含以上代码&#xff09; 基本属性 信号 一、信号种类 //当前项发生变化时触…

Docker容器与虚拟化技术:Dockerfile部署LNMP

目录 一、理论 1.LNMP架构 2.背景 3.Dockerfile部署LNMP 3.构建Nginx镜像 4.构建MySQL容器 5.构建PHP镜像 6.启动 wordpress 服务 二、实验 1.环境准备 2.构建Nginx镜像 3.构建MySQL容器 4.构建PHP镜像 5.启动 wordpress 服务 三、问题 1.构建nginx镜像报错 …

库克发文庆祝苹果入华 30 周年

8月18日&#xff0c;苹果CEO蒂姆库克在微博上发布了一条庆祝苹果进入中国30周年的消息&#xff0c;称“我们衷心感谢所有的同事、顾客和合作伙伴&#xff01;” 此外&#xff0c;苹果官方新闻稿也发文庆祝入华 30 周年&#xff0c;库克在新闻稿中表示&#xff1a;“30 年来&am…

公文处理101:高效率的文件管理与优化流程

公文处理是每个企业和机构中不可或缺的日常工作。对公文的高效管理和流程优化不仅能提高工作效率&#xff0c;还能确保文件的安全、准确和及时性。本文为你提供一套公文处理的基础知识和技巧。 1.文件分类与归档 重要性&#xff1a;结构化的文件分类可以确保每个文档都能迅速找…