### Java编程中如何优雅地处理异常:实用技巧与最佳实践
#### 1. 精准捕获与分类处理
针对不同异常类型建立分层捕获机制,通过多catch块或异常继承体系实现精准处理。例如对业务异常使用BusinessException封装,对技术异常采用TechnicalException承载,避免笼统的Exception捕获。
#### 2. 异常转译与上下文保全
采用异常包装模式保持调用链信息,如在DAO层捕获SQLException后抛出的DataAccessException应包含原始异常:
```java
throw new DataAccessException(数据库操作失败, sqlEx);
```
#### 3. 防御式编程与空值策略
运用Optional类替代显式空值判断,结合Objects.requireNonNull进行参数验证:
```java
public void process(Order order) {
this.order = Objects.requireNonNull(order, 订单对象不能为空);
}
```
#### 4. 资源管理自动化
采用try-with-resources语法确保资源释放:
```java
try (FileInputStream fis = new FileInputStream(data.bin);
BufferedInputStream bis = new BufferedInputStream(fis)) {
return bis.readAllBytes();
}
```
#### 5. 自定义异常体系构建
建立具有业务语义的异常层次结构:
```java
public class PaymentException extends RuntimeException {
private final ErrorCode errorCode;
public PaymentException(ErrorCode code, String message) {
super(message);
this.errorCode = code;
}
}
```
#### 6. 异常日志记录规范
遵循记录一次,抛出一次原则,在异常发生点记录完整上下文:
```java
catch (DataFormatException ex) {
log.error(数据解析失败 - 文件:{} 偏移量:{}, fileName, offset, ex);
throw new ProcessingException(数据格式错误, ex);
}
```
#### 7. 断言与验证机制
使用Preconditions类或Assert语句进行前置校验:
```java
public void transfer(Account from, Account to, BigDecimal amount) {
Preconditions.checkArgument(amount.compareTo(BigDecimal.ZERO) > 0,
转账金额必须大于零);
}
```
#### 8. 异步异常处理策略
在CompletableFuture中通过exceptionally方法处理异步异常:
```java
CompletableFuture.supplyAsync(this::fetchData)
.exceptionally(ex -> {
log.error(异步任务执行失败, ex);
return defaultData;
});
```
#### 9. 全局异常处理架构
通过@ControllerAdvice实现统一异常处理:
```java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity handleBusinessException(BusinessException ex) {
return ResponseEntity.status(HttpStatus.BAD_REQUEST)
.body(ErrorResponse.fromException(ex));
}
}
```
#### 10. 异常测试覆盖
使用AssertJ异常断言确保异常处理逻辑正确性:
```java
@Test
void should_throw_exception_when_amount_negative() {
assertThatThrownBy(() -> paymentService.transfer(-100))
.isInstanceOf(InvalidAmountException.class)
.hasMessageContaining(金额不能为负);
}
```
通过系统化实施这些异常处理策略,可显著提升代码健壮性与可维护性,构建出既满足业务需求又具备工程美雅的Java应用程序。

被折叠的 条评论
为什么被折叠?



