什么是异常处理

文章目录

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

异常处理

介绍

  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)

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

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

相关文章

飞天使-k8s简单搭建(编写中)

文章目录 k8s概念安装部署无密钥配置与hosts与关闭swap开启ipv4转发安装前启用脚本开启ip_vs安装指定版本docker 安装kubeadm kubectl kubelet,此部分为基础构建模版 k8s一主一worker节点部署k8s三个master部署虚拟负载均衡ip创建 参考链接地址 k8s概念 K8sMaster : 管理K8sNo…

Python学习笔记_基础篇(二)_数据类型之字符串

一.基本数据类型 整数&#xff1a;int 字符串&#xff1a;str(注&#xff1a;\t等于一个tab键) 布尔值&#xff1a; bool 列表&#xff1a;list 列表用[] 元祖&#xff1a;tuple 元祖用&#xff08;&#xff09; 字典&#xff1a;dict 注&#xff1a;所有的数据类型都存在想对应…

Jmeter 连接 MySQL 数据库脚本

1、创建线程组 2、创建 JDBC Connection Configuration 3、创建 JDBC Request 4、最终创建的目录 5、重点来了 5.1 在百度中下载个 MySQL-connector-Java-8.0.28.jar&#xff0c;放在 jmeter 的 bin 目录下 5.2 在测试计划中&#xff0c;将 jar 包添加到脚本中 5.3 输入参…

【动态map】牛客挑战赛67 B

登录—专业IT笔试面试备考平台_牛客网 题意&#xff1a; 思路&#xff1a; 考虑动态的map 可以先定义一个状态&#xff0c;然后用map统计前缀这个状态的出现次数 在这里&#xff0c;定义{a,b}为cnt1 - cnt0和cnt2 - cnt0 当cnt0 和 cnt1都和cnt2相同时&#xff0c;统计贡献…

算法通关村第3关【白银】| 双指针思想

1. 双指针思想 双指针不仅指两个指针&#xff0c;也可以是两个变量&#xff0c;指向两个值。 有三种类型&#xff1a; 快慢型&#xff1a;一前一后对撞型&#xff1a;从两端向中间靠拢背向型&#xff1a;从中间向两端分开 2. 删除元素专题 2.1原地移除元素 (1)快慢指针 思…

Docker安装基础使用练习

目录 1、安装Docker-CE 1&#xff09;简单使用yum方式安装 ! 2&#xff09;配置镜像加速&#xff1a; 2、下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 1&#xff09;先查看我们所需的镜像有哪些版本。使用search命令&#xff01; 2&#xff09;下载镜像使用的是pul…

nestjs 基础、使用 passport 来进行鉴权

回顾一些定义 NestJS 部分 Module 模块结构 模块是一个图状引用关系。 模块的实例化有三种模式。默认情况是 singletones 模式&#xff0c;也就是模块可能被引用&#xff0c;但不同的引用处拿的是同一个共享实例&#xff0c;也就是说一个进程有一个唯一的实例被共享。 模块&a…

uni-app自定义多环境配置,动态修改appid

背景 在企业级项目开发中&#xff0c;一般都会分为开发、测试、预发布、生产等多个环境&#xff0c;在工程化中使用不同的打包命令改变环境变量解决不同环境各种变量需要手动修改的问题&#xff0c;比如接口请求地址&#xff0c;不同环境的请求路径前缀都是不同的。在使用uni-…

虚拟现实与增强现实技术的商业应用

章节一&#xff1a;引言 随着科技的不断发展&#xff0c;虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;与增强现实&#xff08;Augmented Reality&#xff0c;简称AR&#xff09;技术正日益成为商业领域中的重要创新力量。这两种技术为企业带来了前所未…

深入源码分析kubernetes informer机制(四)DeltaFIFO

[阅读指南] 这是该系列第四篇 基于kubernetes 1.27 stage版本 为了方便阅读&#xff0c;后续所有代码均省略了错误处理及与关注逻辑无关的部分。 文章目录 client-go中的存储结构DeltaFIFOdelta索引 keyqueue push操作delta push 去重 queue pop操作 总结 client-go中的存储结构…

CCLINK转MODBUS-TCP网关cclink通讯接线图 终端电阻

大家好&#xff0c;今天我们要聊的是生产管理系统中的CCLINK和MODBUS-TCP协议&#xff0c;它们的不同使得数据互通比较困难&#xff0c;但捷米JM-CCLK-TCP网关的出现改变了这一切。 1捷米JM-CCLK-TCP是一款自主研发的CCLINK从站功能的通讯网关&#xff0c;它的主要功能是将各种…

PS丢失d3dcompiler_47.dll文件怎么办(附详细修复方法)

我们在安装PS等软件的时候&#xff0c;有可能安装完之后出现以下问题&#xff08;特别是win10或者win11系统&#xff09; 错误&#xff1a; 打开PS的时候出现这个错误&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失D3DCOMPILER_47.dll。尝试重新安装该程序以解决此问…

[Go版]算法通关村第十一关青铜——理解位运算的规则

目录 数字在计算机中的表示&#xff1a;机器数、真值对机器数进一步细化&#xff1a;原码、反码、补码为何会有原码、反码和补码为何计算机中的按位运算使用的是补码&#xff1f;位运算规则与、或、异或和取反移位运算移位运算与乘除法的关系位运算常用技巧⭐️ 操作某个位的数…

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途&#xff1a; ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器&#xff0c;用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等&#xff1b;室内使用效果均佳。 产品特点&#xff…

linux——MongoDB服务

目录 一、MongoDB概述 相关概念 特性 应用场景 二、目录结构 三、默认数据库 admin local config 四、数据库操作 库操作 文档操作 五、MongoDB数据库备份 一、备份 mongodump mongoexport 二、恢复 mongorestore mongoimport ​编辑 一、MongoDB概述 MongoDB是…

04-微信小程序常用组件-基础组件

04-微信小程序常用组件-基础组件 文章目录 基础内容icon 图标案例代码 text 文本案例代码 progress 进度条案例代码 微信小程序包含了六大组件&#xff1a; 视图容器、 基础内容、 导航、 表单、 互动和 导航。这些组件可以通过WXML和WXSS进行布局和样式设置&#xff0c…

数据库相关面试题

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 mysql怎么优化 : MySQL的优化可以从以下几个方面入手&#xff1a; 数据库设计优化&#xff1a;合理设计表结构&#xff0c;选择合适的数…

Windows下问题定位

1、内存相关知识点&#xff1b; 1&#xff09;windows下32位进程&#xff0c;用户态为2G内存&#xff0c;内核态也为2G内存&#xff1b;却别于linux操作系统&#xff1b; 备注&#xff1a;可以通过命令行与管理员权限&#xff0c;启动3G的用户态空间&#xff0c;但是部…

数据结构的树存储结构

数据结构的树存储结构 之前介绍的所有的数据结构都是线性存储结构。本章所介绍的树结构是一种非线性存储结构&#xff0c;存储的是具有“一对多”关系的数据元素的集合。 (A) (B) 图 1 树的示例 图 …

同伦问题与同伦算法

同伦问题 据我所知&#xff0c;这篇博客是CSDN上少数几篇讲同伦算法的博客之一考虑同伦算法的目的 扩大初值选取范围解决非线性代数方程组的全部解计算问题 同伦算法中的基本概念 考虑求的解人为地引入参数t,构造一个函数族使得 同时假设的解已知&#xff0c;从出发可以求解对…