Java 如何抛错让前端看见

在现代 web 应用中,后端与前端通常是分离的,前端会通过 API 请求后端服务。如果后端发生错误,为了更好地处理用户体验,我们需要将错误信息传递给前端。本文将介绍一种有效的方式,以便在 Java 后端中抛出错误,前端可以捕获并友好地展示这些错误信息。

错误处理原则

首先,我们需要定义如何在后端处理错误,并将其结构化,以便前端能够轻松理解。我们可以创建一个统一的错误响应格式,如下表所示:

字段名 类型 说明
code Integer 错误代码
message String 错误信息
timestamp String 错误发生的时间

我们的目标是创建一个 ErrorResponse 类来封装错误信息,并在控制器中使用全局异常处理器返回错误信息。

代码示例

1. 创建 ErrorResponse 类

public class ErrorResponse {
    private int code;
    private String message;
    private String timestamp;

    public ErrorResponse(int code, String message) {
        this.code = code;
        this.message = message;
        this.timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    }

    // Getters and Setters
}

2. 创建全局异常处理器

使用 Spring Boot,可以通过 @ControllerAdvice 创建一个全球异常处理器:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(CustomException.class)
    public ResponseEntity<ErrorResponse> handleCustomException(CustomException e) {
        ErrorResponse errorResponse = new ErrorResponse(e.getCode(), e.getMessage());
        return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
    }

    // 其他异常处理方法
}

3. 自定义异常类

可以创建一个自定义异常类 CustomException

public class CustomException extends RuntimeException {
    private int code;
    
    public CustomException(int code, String message) {
        super(message);
        this.code = code;
    }

    public int getCode() {
        return code;
    }
}

4. 控制器抛出异常

在控制器的方法中,可以根据需要抛出 CustomException

@RestController
@RequestMapping("/api")
public class UserController {

    @GetMapping("/user/{id}")
    public ResponseEntity<User> getUser(@PathVariable int id) {
        if (id <= 0) {
            throw new CustomException(400, "用户ID无效");
        }
        // 查询用户逻辑
        return ResponseEntity.ok(user);
    }
}

序列图说明

当用户向后端请求数据时,错误处理的流程如下所示:

sequenceDiagram
    participant Frontend as 前端
    participant Backend as 后端
    participant DB as 数据库

    Frontend->>Backend: GET /api/user/0
    Backend->>Backend: 校验用户ID
    Backend-->>Frontend: 400 Bad Request (用户ID无效)

结论

通过上述的实现方法,我们可以有效地在 Java 后端抛出错误,并将错误信息结构化地传递给前端。这样的设计使得前端能够友好地展示错误信息,提高了用户体验。无论出现什么样的错误,前端都可以清晰地告知用户,从而使得用户能够更方便地进行操作。希望本文能为您的项目提供帮助,推动更高效的错误处理机制。