54、错误处理-【源码流程】异常处理流程
54、错误处理-【源码流程】异常处理流程
#### 异常处理流程概述
1. **执行目标方法**:
- 程序执行目标方法,期间若发生异常,会被捕获并记录,标志当前请求结束。
- 将异常信息赋值给 `dispatchException` 变量。
2. **进入视图解析流程**:
- 调用 `processDispatchResult` 方法,处理请求结果和异常。
3. **处理异常**:
- **遍历异常解析器**:
- 调用所有注册的 `HandlerExceptionResolver` 解析器,尝试处理异常。
- **系统默认异常解析器**:
- `DefaultErrorAttributes` 将异常信息保存到 `request` 域的 `ERROR_ATTRIBUTE` 中,并返回 `null`。
- 由于默认情况下没有其他解析器能处理异常,异常会被继续抛出。
4. **转发到错误处理页面**:
- 底层检测到未处理的异常后,会转发请求到 `/error` 路径。
- `BasicErrorController` 处理 `/error` 请求:
- 获取异常信息,设置响应状态码。
- 查找并渲染错误页面视图:
- 若存在对应的错误页面(如 `error/500.html`),则返回该页面。
- 若未找到,则返回默认的 `error` 视图。
#### 关键组件
1. **`HandlerExceptionResolver`**:
- 异常解析器接口,用于处理控制器中抛出的异常。
- `DefaultErrorAttributes` 实现了该接口,负责保存异常信息。
2. **`BasicErrorController`**:
- 处理 `/error` 请求的控制器,负责返回错误响应。
- 根据请求类型和错误信息,选择合适的视图进行渲染。
3. **`DefaultErrorViewResolver`**:
- 默认的错误视图解析器,根据响应状态码查找对应的错误页面。
#### 总结
该异常处理流程通过多层机制,确保异常信息能够被捕获并展示给用户或开发者,提升了应用程序的健壮性和可维护性。