什么是异常处理

文章目录

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

异常处理

介绍

  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.rhkb.cn/news/95302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 NLP 进行文本摘要

一、说明 文本摘要是为较长的文本文档生成简短、流畅且最重要的是准确摘要的过程。自动文本摘要背后的主要思想是能够从整个集合中找到最重要信息的一小部分&#xff0c;并以人类可读的格式呈现。随着在线文本数据的增长&#xff0c;自动文本摘要方法可能会非常有用&#xff0c…

mysql 数据备份和恢复

操作系统&#xff1a;22.04.1-Ubuntu mysql 版本&#xff1a;8.033 binlog 介绍 binlog 是mysql 二进制日志 binary log的简称&#xff0c;可以简单理解为数据的修改记录。 需要开启binlog,才会产生文件&#xff0c;mysql 8.0 默认开启,开启后可以在 /var/lib/mysql &#xff…

AJ-Captcha行为验证在vue中的使用

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目场景&#xff1a;由原先的验证码校验升级为行为验证校验 使用方法 提示&#xff1a;参考文档&#xff1a; 参考文档&#xff1a;vue使用AJ-Captcha文档 gitee地址&#xff1a;AJ-Captcha &…

什么是微服务?

2.微服务的优缺点 优点 单一职责原则每个服务足够内聚&#xff0c;足够小&#xff0c;代码容易理解&#xff0c;这样能聚焦一个指定的业务功能或业务需求&#xff1b;开发简单&#xff0c;开发效率提高&#xff0c;一个服务可能就是专一的只干一件事&#xff1b;微服务能够被小…

26、springboot的自动配置03--核心功能--自定义条件注解及使用

开发自己的自动配置------开发自己的条件注解 ★ 自定义条件注解 好处有两个&#xff1a; 1. 真正掌握Spring boot条件注解的本质。 2. 项目遇到一些特殊的需求时&#xff0c;也可以开发自己的自定义条件注解来解决问题。自定义条件注解&#xff1a; ▲ 所有自定义注解其实都…

ICT产教融合创新实训基地软件测试实训室建设方案

一 、系统概述 ICT产教融合创新&#xff0c;简单来说&#xff0c;就是信息与通信技术&#xff08;ICT&#xff09;与产业界、教育界的融合创新。这个概念强调了在现代社会中&#xff0c;信息技术与产业发展以及教育培训之间相互关联的重要性。 ICT产教融合创新的核心思想包括以…

lambda表达式

一&#xff0c;什么是lambda表达式 1.1 函数式接口 要想了解什么是lambda表达式&#xff0c;就必须得知道什么是函数式接口&#xff0c;函数式接口是指只包含一个抽象方法的接口。如果我们自己写一个函数时接口&#xff0c;最好在接口前添加Functionallnterface&#xff0c;和…

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

【数据结构】栈和队列

大家好&#xff01;今天我们来学习数据结构中的栈和队列。 目录 1. 栈 1.1 栈的概念及结构 1.2 栈的定义 1.3 栈的接口实现 1.3.1 初始化栈 1.3.2 入栈 1.3.3 出栈 1.3.4 获取栈顶元素 1.3.5 获取栈中有效元素个数 1.3.6 检测栈是否为空 1.3.7 销毁栈 1.4 栈的完整…

堆 和 优先级队列(超详细讲解,就怕你学不会)

优先级队列 一、堆的概念特性二、堆的创建1、向下调整算法2、向下调整建堆3、向下调整建堆的时间复杂度 三、堆的插入1、向上调整算法实现插入2、插入创建堆的时间复杂度 三、堆的删除四、Java集合中的优先级队列1、PriorityQueue 接口概述及模拟实现2、如何创建大根堆&#xf…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 1.动态获取地域数据以及数据中的平均值&#xff0c;按照平均值降序排序&#xff1b; 说明&#xff1a; X轴是动态的&#xff0c;有对应区域数据则展示&#xff1b; X轴 区域数据降序排序&#xff1b;…

Intelij IDEA 配置Tomcat解决Application Server不显示的问题

今天搭建war工程时部署项目发现&#xff0c;IDEA的控制台没有Application Servers&#xff0c;在网上查了一下&#xff0c;总结几个比较好的解决方法&#xff0c;为了方便自己和其他人以后碰到相同的问题&#xff0c;不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

目录 前言阅读准备阅读指引阅读建议 课程内容一、依赖注入方式&#xff08;前置知识&#xff09;1.1 手动注入1.2 自动注入1.2.1 XML的autowire自动注入1.2.1.1 byType&#xff1a;按照类型进行注入1.2.1.2 byName&#xff1a;按照名称进行注入1.2.1.3 constructor&#xff1a;…

uniapp小程序实现上传图片功能,并显示上传进度

效果图&#xff1a; 实现方法&#xff1a; 一、通过uni.chooseMedia(OBJECT)方法&#xff0c;拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…

【Django】无法从“django.utils.encoding”导入名称“force_text”

整晚处理 Django 的导入错误。 我将把它作为提醒&#xff0c;希望处于相同情况的人数会减少。 原因 某些软件包版本不支持Django 4 请看下表并决定Django和Python的版本 方案 如果出现难以响应&#xff0c;或者更改环境麻烦&#xff0c;请尝试以下操作 例如出现以下错误 …

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子&#xff08;operator&#xff09;是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件&#xff0c;实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元&#xff0c;它们…

程序的DAC检查与LSM简介

程序的DAC检查 在Linux中&#xff0c;程序的DAC&#xff08;Discretionary Access Control&#xff0c;自主访问控制&#xff09;检查是指操作系统对程序执行期间对文件和资源的访问权限进行的检查。 Linux使用一种基于权限的访问控制模型&#xff0c;其中每个文件和资源都与…