55、错误处理-【源码流程】几种异常处理原理
55、错误处理-【源码流程】几种异常处理原理
#### 自定义错误页
- **原理**:
- 在项目中定义特定的错误页面,如`error/404.html`、`error/5xx.html`等。
- 当系统发生相应错误时,服务器会自动查找并返回对应的错误页面。
- **流程**:
1. 发生错误,服务器根据错误状态码(如404、500等)查找对应的错误页面。
2. 如果找到精确匹配的错误页面,则返回该页面;否则,返回通用的`4xx.html`或`5xx.html`页面。
3. 如果都没有匹配的错误页面,则触发默认的白页(空白页面)。
#### `@ControllerAdvice` + `@ExceptionHandler`处理全局异常
- **原理**:
- 使用`@ControllerAdvice`注解标记一个类,作为全局异常处理的控制器。
- 在该类中使用`@ExceptionHandler`注解标记方法,用于处理特定类型的异常。
- **流程**:
1. 程序运行过程中发生异常。
2. Spring框架的`ExceptionHandlerExceptionResolver`检测到异常。
3. 根据异常类型查找`@ControllerAdvice`类中匹配的`@ExceptionHandler`方法。
4. 执行匹配的`@ExceptionHandler`方法,返回相应的处理结果(如视图、JSON数据等)。
- **示例**:
```java
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler({ArithmeticException.class, NullPointerException.class})
public String handleArithmeticException(Exception e) {
log.error("发生异常:{}", e);
return "error"; // 跳转到错误页面
}
}
```
#### `@ResponseStatus` + 自定义异常
- **原理**:
- 创建一个自定义异常类,并使用`@ResponseStatus`注解标记,指定HTTP状态码和原因。
- 当程序抛出该自定义异常时,Spring框架会自动设置响应的HTTP状态码和原因。
- **流程**:
1. 程序运行过程中,满足特定条件时手动抛出带有`@ResponseStatus`注解的自定义异常。
2. Spring框架的`ResponseStatusExceptionResolver`检测到该异常。
3. 根据`@ResponseStatus`注解的信息,设置响应的HTTP状态码和原因。
4. 返回对应的错误信息给客户端。
- **示例**:
```java
@ResponseStatus(value = HttpStatus.FORBIDDEN, reason = "用户数量太多")
public class UserTooManyException extends RuntimeException {
// 构造方法等
}
@Controller
public class UserController {
@GetMapping("/register")
public String register() {
if (userCount > MAX_USER_COUNT) {
throw new UserTooManyException();
}
// ...
}
}
```
#### Spring自带异常处理
- **原理**:
- Spring框架内置了一些异常处理器,如`DefaultHandlerExceptionResolver`,用于处理Spring框架自身抛出的异常。
- **流程**:
1. 程序运行过程中,Spring框架检测到自身抛出的异常(如`MissingServletRequestParameterException`等)。
2. `DefaultHandlerExceptionResolver`或其他相应的异常处理器处理该异常。
3. 根据异常类型,设置响应的HTTP状态码和错误信息。
4. 返回错误响应给客户端。
通过以上几种方式,可以有效地处理程序中的各种异常,提高系统的健壮性和用户体验。