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
相关产品推荐
相关产品推荐

