You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SparkJava全局异常处理方案咨询:替代逐端点try/catch

SparkJava 全局异常处理器实现方案

SparkJava 本身就支持全局异常处理,完全不用在每个端点写try/catch,和Spring/Play的全局异常机制思路一致,具体实现步骤如下:

1. 自定义业务异常类

先定义对应HTTP状态码的异常,方便后续区分处理:

// 4xx 客户端异常示例
public class BadRequestException extends RuntimeException {
    public BadRequestException(String message) {
        super(message);
    }
}

// 5xx 服务端异常示例
public class InternalServerException extends RuntimeException {
    public InternalServerException(String message) {
        super(message);
    }
}

2. 注册全局异常处理器

在Spark应用初始化时,用exception()方法为不同异常绑定处理逻辑,返回对应状态码和响应体:

public class App {
    public static void main(String[] args) {
        // 处理客户端异常,返回400状态码
        exception(BadRequestException.class, (exception, request, response) -> {
            response.status(400);
            response.body("{\"error\": \"" + exception.getMessage() + "\"}");
            response.type("application/json");
        });

        // 处理服务端异常,返回500状态码
        exception(InternalServerException.class, (exception, request, response) -> {
            response.status(500);
            response.body("{\"error\": \"服务器内部错误: " + exception.getMessage() + "\"}");
            response.type("application/json");
        });

        // 捕获所有未定义的异常,返回500兜底
        exception(Exception.class, (exception, request, response) -> {
            response.status(500);
            response.body("{\"error\": \"未知错误\"}");
            response.type("application/json");
        });

        // 示例端点,直接抛出异常即可
        get("/api/users/:id", (req, res) -> {
            String userId = req.params("id");
            if (!userId.matches("\\d+")) {
                throw new BadRequestException("用户ID必须是数字");
            }
            // 模拟服务端错误
            if (userId.equals("999")) {
                throw new InternalServerException("查询用户数据失败");
            }
            return "{\"id\": " + userId + ", \"name\": \"Test User\"}";
        });
    }
}

3. 核心说明

  • exception(Class<? extends Exception> exceptionClass, ExceptionHandler handler) 是Spark提供的全局异常注册API,每个异常类可以绑定一个处理器
  • 处理器里可以自由设置响应状态码、响应体、Content-Type等
  • 端点代码里直接抛出对应异常即可,不用再写try/catch,代码会简洁很多

这种方式完全替代了分散的try/catch,扩展性强,后续新增异常类型只需添加对应的exception()注册即可。

内容的提问来源于stack exchange,提问作者Carmen Camacho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:54:56