当前位置: 首页 > news >正文

SpringBoot-Web开发之异常处理

默认规则

1. 默认情况下,SpringBoot提供/error处理所有错误的映射

2. 对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息

  • 例如postman发送请求

3. 对于浏览器客户端,响应一个“whitelabel”错误视图,以HTML格式呈现相同的数据

4. 自定义错误视图解析规则

  • 完全替换默认行为,可以实现 ErrorController 并注册该类型的Bean定义,或添加ErrorAttributes类型的组件

定制错误处理逻辑

1. 自定义错误页

  • 替换默认的“whitelabel”错误视图,在templates在创建error文件夹,定义404和5xx的视图error/404.html error/5xx.html
  • 有精确的错误状态码页面就匹配精确,没有就找4xx.html或者N(错误状态码首数字)xx.html;如果都没有就触发白页

2. 方法一:@ExceptionHandler处理异常

  • 注解用来定义一个或多个具体的异常类型,发生异常时由此处理
  • @ControllerAdvice+@ExceptionHandler处理全局异常
  • 底层是 ExceptionHandlerExceptionResolver 支持的
/*** 处理整个web controller的异常*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {//定义可以处理的异常@ExceptionHandler({ArithmeticException.class,NullPointerException.class})public String handleArithException(Exception e){log.error("异常是:{}",e);//返回视图地址,也可以返回ModelAndViewreturn "login";}
}

3. 方法二:@ResponseStatus+自定义异常

  • 指定发生异常时的响应状态码,自定义异常类型
  • 底层是 ResponseStatusExceptionResolver
  • 把ResponseStatus注解的信息组装成ModelAndView返回
    • 底层调用 response.sendError(statusCode, resolvedReason);
    • tomcat发送的/error
//异常响应状态码+异常原因
@ResponseStatus(value= HttpStatus.FORBIDDEN,reason = "用户数量太多")
public class UserTooManyException extends RuntimeException {public  UserTooManyException(){}public  UserTooManyException(String message){super(message);}
}

4.  Spring底层的异常

  • 如参数类型转换异常
  • DefaultHandlerExceptionResolver 处理框架底层的异常
    • 解析异常时做了一系列异常类型的判断
    • 每个异常处理都会执行response.sendError(.....),tomcat发送/error请求
    • 如果还是解析不了,就会响应tomcat的错误页面

5. 方法三:自定义实现 HandlerExceptionResolver 处理异常

  • @Order(value = Ordered.HIGHEST_PRECEDENCE) 将优先级设为最高
  • 如果不加优先级,默认是排列在自动配置的异常处理器之后,若默认的处理器可以处理异常,故自定义的异常处理器不会生效
  • 调用response.sendError(.....),tomcat发送/error请求
//优先级,数字越小优先级越高
@Order(value= Ordered.HIGHEST_PRECEDENCE)
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler, Exception ex) {try {//状态码+异常信息response.sendError(511,"我喜欢的错误");} catch (IOException e) {e.printStackTrace();}return new ModelAndView();}
}

6. 关于response.sendError()

  • 自己调用response.sendError(),请求会被转发给basicErrorController进行处理
  • 如果自己没有调用,并且异常没有任何人能够处理,tomact底层会自动调用response.sendError()将请求转发给basicErrorController处理。
  • 总之,三种方法最后都会调用sendError()转交给basicErrorController处理,ErrorViewResolver进行解析,最后会转到一个页面或者返回json数据。

异常处理自动配置原理

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

1. 绑定配置文件的server spring.mvc 

2. 自动添加组件:类型:DefaultErrorAttributes -> id:errorAttributes

  • DefaultErrorAttributes:定义错误页面中可以包含哪些数据
  • DefaultErrorAttributes implements ErrorAttributes,HandlerExceptionResolver
  • 自定义错误页面属性

3. 自动添加组件:类型:BasicErrorController --> id:basicErrorController

  • 可以通过BasicErrorController 自定义页面跳转逻辑
  • 处理默认 /error 路径的请求;页面响应 new ModelAndView("error", model),
    • 要么响应一个HTML页面,要么响应一个json

  • 容器中有组件 View->id是error;(响应默认错误页)

  • 容器中放组件 BeanNameViewResolver(视图解析器);按照返回的视图名作为组件的id去容器中找View对象

4. 自动添加组件:类型:DefaultErrorViewResolver -> id:conventionErrorViewResolver

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

异常处理步骤流程

  • 举例,执行一个controller方法,除数为0抛出异常

1. doDispatch()中执行controller目标方法

  • 目标方法运行期间有任何异常都会被catch、而且标志当前请求结束
  • 并且将异常赋值给 dispatchException
  • 即使目标方法发生异常,也执行视图解析流程

2. 处理handler发生的异常,处理完成返回ModelAndView

  •  遍历所有的 handlerExceptionResolvers,看谁能处理当前异常【HandlerExceptionResolver处理器异常解析器】
    • DefaultErrorAttributes先来处理异常,把异常信息保存到request域,并且返回null
    • 然后交由HandlerExceptionResolverComposite,遍历其中的异常处理器处理,但此例子默认无法处理
      • ExceptionHandlerExceptionResolver,使用注解@ExceptionHandler才能由此解析处理
      • ResponseStatusExceptionHandler,使用注解@ResponseStatus才能由此解析处理

3. 默认无法处理目标方法异常时,异常会被抛出

  • 底层就会发送 /error 请求,会被BasicErrorController处理

  • 解析错误视图;遍历所有的 ErrorViewResolver 看谁能解析

4. 模板引擎响应出错误视图

  • 默认的 DefaultErrorViewResolver ,作用是把响应状态码作为错误页的地址,error/500.html
  • 查找顺序:
    • '/templates/error/500.html' >
    • '/static/error/500.html' >
    • '/templates/error/5xx.html' >
    • '/static/error/5xx.html'

http://www.dtcms.com/a/520742.html

相关文章:

  • wap网站和app的区别php网站后台建设
  • 舞阳网站建设如何引流被动加好友
  • js wordpress 菜单管理如何给网站做seo优化
  • Nginx server_name 配置详解
  • 做宣传网站网页制作素材去哪找
  • 百度地图网站开发wordpress会员权限
  • 微硕WSF2040 N沟MOSFET:汽车电动尾门“防夹升降核”
  • 网站建设投标书报价表建设电子商务网站的好处
  • 网站建设与开发教学大纲全网商机app招标
  • Less-4 GET-Error based-Double Quotes-String
  • 互斥锁、读写锁、ref()函数使用
  • 2.6、Web漏洞挖掘实战(下):XSS、文件上传与逻辑漏洞深度解析
  • 邢台做网站的公司有那个营销型网站建设营销型
  • 青岛住房和城乡建设厅网站首页iis7.0 asp网站配置
  • vue3表格显示隐藏列全屏拖动功能
  • Git Commit Message 规范:写出清晰、可维护的提交记录
  • Orleans + Kubernetes + Istio 服务网格集成深度解析
  • 51网站怎么打开注册城乡规划师有什么用
  • 相向指针|盛最多水的容器|接雨水|验证回文串
  • Web3j 中使用 Transaction 类进行以太坊交互的核心方法
  • 承德微网站开发怎么弄一个自己的网站
  • web及h5录音wav下载
  • Kotlin 协程中常见的异步返回与控制方式(速览)
  • 做网站还有前景么动漫网页设计报告
  • Maven 多配置文件的使用
  • 【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
  • SQL 拼接完全指南
  • 制作的网站wordpress还是自己写
  • 【HLS】Java实现统计HLS的m3u8清单中所有ts切片的视频持续时长
  • 免费网站建设ppt模板下载山西省建设银行网站首页