web的自定义异常处理

目录

学习目标

一.自定义异常处理的介绍

二.自定义错误响应页面

响应页面定义可以有几种方式

第1种:有模板引擎 

第2种:没有模板引擎

第3种:模板/静态目录种均无相应错误页面,直接响应SpringBoot默认错误页面 

自定义错误页面 

·运行测试,并在index方法中主动制造错误,测试500页面,访问不存在的url,测试404页面

三.自定义异常处理原理

1.相关配置与文件

          2. BasicErrorController :

                   3. DefaultErrorViewResolver :

四.自定义错误处理

五.总结

一、什么是自定义异常?为什么要使用自定义异常?

二、如何定义自定义异常类?

三、如何使用自定义异常?

四、自定义异常类可以有哪些属性和方法?

五、自定义异常与预定义异常有何区别?


前言

学习目标

  • 学习自定义响应页面的方式

  • 学习和掌握自定义错误页面的实现

  • 学习和掌握自定义错误处理

  • 学习和掌握全局数据绑定功能

一.自定义异常处理的介绍

Spring Boot提供了默认的错误处理机制,由于弹窗信息基本使用的是whitelabel Error Page页面,信息提示通常也是以英文呈现,对用户并不友好。

从出错提示中,可以发现无论发生什么错误,Spring Boot都会返回一个状态码及错误页面,如果关注源码可以知道,这些错误信息的底层原来是ErrorMvcAutoconfiguration错误自动配置类。当应用程序出现4xx或5xx之类错误是,ErrorPageCustomizer就会被激活,它主要用于定制错误处理的响应规则。

二.自定义错误响应页面

响应页面定义可以有几种方式

第1种:有模板引擎 

      精确匹配error状态码,通过将错误页面命名为具体的错误状态码,例如:404.htm1放在引擎目录templates/error目录中,当发生对应状态码错误时,就可以响应对应的模板页 ·

  模糊匹配error状态码,通过定义4xx或5xx,匹配对应类型的所有错误

 此种方式,精确匹配优先于模糊匹配

timestamp:时间戳 

status:状态码

error:错误提示

exception:异常对象

message:异常消息

errors: JSR303数据校验错误 


第2种:没有模板引擎

此种方式,模板引擎无法找到对应的错误页面

将至静态资源目录中的error目录中找相应页面 

第3种:模板/静态目录种均无相应错误页面,直接响应SpringBoot默认错误页面 

如果BasicErrorController的errorhtm1方法没有找到对应的view对象,将前往error定义在ErrorMvcAutoconfiguation的defaultErrorview中

自定义错误页面 

·在resources/templates中添加首页的index.htm1页面

·在源码文件夹Application类的同目录中添加web文件夹,并创建Indexcontroller

·使用@Controller注解,完整名称org.springframework.stereotype.controller

Annotation(注解)是Java的一种特殊注释机制,JVM可通过反射读取注解内容,从而根据注解内容进行特定操作。

注解以@开头 

常见注解如@override,给tostring等方法注解表示重写,这类的注解仅用于开发者,编译器处理完就会被去掉

该注解用于定义控制器类,在spring项目中由控制器负责将用户发来的请求转发到对应的服务接口( service层)

·添加一个index方法,为index页面提供页面数据(此处无)

·为index方法添加@GetMapping(" /")注解,该注解提供路由信息,负责URL到controller中的具体方法的映射;也可以通过webMvcconfigure r进行视图和控制器的映射实现页面映射

·在templates 中创建error文件夹,并创建404.htm1和500.htm1两个页面

·运行测试,并在index方法中主动制造错误,测试500页面,访问不存在的url,测试404页面

package cn.edu.1zzy.config;

import org.springframework.context.annotation.configuration;
import org.springframework.web.servlet.config.annotation.viewControllerRegistry;
import org.springframework.web.servlet.config.annotation.webMvcConfigurer;
/**
*spring mvc自定义配置
*/
@configuration
public class Mvcconfigure implements webMvcconfigurer {
public void addviewcontro1lers(viewContro1lerRegistry registry) {
//这样就不需要为每一个页面编写Control1er代码了,对于纯渲染的页面可以直接这样定义就可以

registry.addviewcontroller("/home").setviewName("index");//forward实现
}
}
<!--temp1ates/index.html-->
<! DOCTYPE htm1>
<htm1 1ang="en">
<head>
<meta charset="UTF-8">
<title>主页</title>
</head>
<body>
<h1>
我是站点首页<br>
内容正在建设中,请耐心等待
</h1>
</body>
</htm1>
<!--templates/error/ 404.htm1-->
<! DOCTYPE htm1>
<htm1 1ang="en" xm1ns:th="http : //www.thyme1eaf.org">
<head></head>
<body>
<div class="container">
<div class="starter-template">
<h1>404--找不到对象</h1>
<div th:in1ine="text">你好,'[[${#httpservletRequest.remoteUser}]]'你访问的页面不存在</div>
</div>
</div>
</body>
</htm1>

三.自定义异常处理原理

1.相关配置与文件

ErrorMvcAutoConfiguration 自动配置异常处理规则。

        组件:1. DefaultErrorAttributes,定义错误页面中可以包含哪些数据

@override
public Map<String,object> getErrorAttributes(WebRequest webRequest,Errc
Map<string,0bject> errorAttributes f getErrorAttributes(webRequest,if(Booleanl.TRUE.equals(this.includeexception) ) i
options = options.including( Include.EXCEPTION);
}
if ( ! options.isIncluded( Include.EXCEPTION)) {
errorAttributes.remove( key: "exception') ;
}
if ( ! options.isIncluded(Include.STACK TRACE)) {
errorAttributes.remove( key: "trace") ;
}
if ( ! options.isIncluded(Include.MESSAGE) && errorAttributes
.get( "mess
errorAttributes.put( "message","");
}
if ( ! options.isIncluded (Include.BINDING_ERRORS)) {
errorAttributes remove( key: "errors"
}
return errorAttributes;
}
@override

          2. BasicErrorController :

处理默认 /error 路径的请求;期间产生一个 View(名字为error的视图,即响应默认错误页),被BeanNameViewResolver视图解析器解析,最终响应一个 ModelAndView。最后渲染错误页面(json/百页)

                   3. DefaultErrorViewResolver :

如果发生错误,会以HTTP状态码作为视图页地址(viewName),找到真正的页面,如error/404、5xx.html

四.自定义错误处理

·在web同目录下添加handler文件夹

·添加两个自定义异常类,NotFoundException和BusinessException,代表资源不存在和业务异常

·添加一个统一的异常处理类PracticeExceptionHandler

使用@controllerAdvice注解该类,该注解将所有controller作为切面,利用切面技术为contro7ler扩展功能

添加专用于业务异常处理的异常处理方法,并使用ExceptionHandler注解,参数为自定义的业务异常类

·添加通用的异常处理方法,并使用ExceptionHandler注解,参数为Exception类

另一个@Restcontro7lerAdvice注解将所有的Restcontro71ler作为切面,为RESTfu1Api扩展功能。

除全局异常处理外,还提供全局数据绑定功能:

全局数据绑定:@Mode1Attribute,可对所有controller的Mode1添加全局属性,示例如下:

①全局控制器添加全局数据

@contro1lerAdvice
public class G1oba1contro1ler{
@Mode1Attribute
public void adda1obalData(Mode1 mode1){
mode7 . addAttribute("contact","1zzy@163.com" );
mode1 .addAttribute( "homeur1","https : / /www. baidu. com")
}
}

②在控制器类中无需绑定数据,如:

@controller
public class Homecontro1ler{
@GetMapping(" /")
public string index(){
return "index"
}
}

③在index.htm1中使用Thymeleaf绑定全局数据

<! DOCTYPE html>
<htm1>
<head>
<title>主页</title>
</head>
<body>
<h1>
<span th:text=""欢迎访问必应搜索引擎: '+$ {homeur1}+’惊不惊喜,意不意外""></span><br>
<span th:text=""联系偶们:'+${contact}"></span>
</h1>
</body>
</html>

在error/error.htm1页面中显示异常信息,以标题显示业务异常,其他详细异常信息以注释的形式保存,在源代码视图中查看

五.总结

一、什么是自定义异常?为什么要使用自定义异常?

答:自定义异常是指根据自己的需求创建的异常类。在 Java 中,虽然有很多预定义的异常类,但有时候这些异常类无法完全满足我们的需求,因此需要创建自定义异常类。自定义异常类能够更好地描述和处理特定的异常情况,提供更详细的错误信息,使代码更加可读和可维护。

二、如何定义自定义异常类?

答:定义自定义异常类需要创建一个类,并继承自 Java 提供的异常类,如 Exception 、RuntimeException,然后添加自定义的构造方法和其他方法来满足特定的异常处理需求。

三、如何使用自定义异常?

答:使用自定义异常时,通常的做法是在方法中使用 throw 语句抛出自定义异常,然后在调用该方法的地方使用 try-catch 语句块捕获并处理异常。

四、自定义异常类可以有哪些属性和方法?

答:自定义异常类可以根据需求添加各种属性和方法。通常来说,自定义异常类会添加构造方法来接收异常信息,还可以添加其他方法来提供额外的功能。

五、自定义异常与预定义异常有何区别?

答:自定义异常是根据自己的需求创建的异常类,而预定义异常是 Java 提供的一些已定义好的异常类。自定义异常可以更好地描述和处理特定的异常情况,提供更详细的错误信息,而预定义异常通常是一些通用的异常类。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好喜欢编程啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值