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

调用Jdbi的withHandle方法仅捕获JdbiException是否安全?

结论

分两种场景判断:

  • 若你传入withHandle的回调逻辑仅调用Jdbi API、没有主动抛出自定义异常,仅捕获JdbiException完全安全,可以覆盖withHandle抛出的所有异常。
  • 若你在回调逻辑里主动抛出了非Jdbi体系的自定义异常,仅捕获JdbiException会漏掉你自定义抛出的异常。

原理说明

  1. 官方定义的JdbiException是Jdbi框架自身抛出的所有异常的父类,所有框架层面的错误(包括SQL执行错误、结果映射错误、数据库连接错误、数据查询不存在等)都会以JdbiException或其子类的形式抛出,不会抛出其他非Jdbi体系的异常。
  2. 你看到的方法签名<R, X extends Exception> R withHandle(HandleCallback<R, X> callback) throws X是Jdbi的泛型设计,目的是支持开发者在回调内抛出自定义受检异常时,不需要强制转换成运行时异常,可以直接向外抛出。该泛型X仅对应你回调里主动抛出的异常类型,和Jdbi框架自身抛出的异常无关。

示例场景

如果你的回调内存在主动抛自定义异常的逻辑,如下:

jdbi.withHandle(handle -> {
    String orderNo = handle.createQuery("select order_no from t_order where id = :id")
        .bind("id", 123)
        .mapTo(String.class)
        .one();
    // 主动抛自定义受检异常,不属于JdbiException体系
    if (orderNo.isBlank()) {
        throw new OrderNotFoundException("指定订单不存在");
    }
    return orderNo;
});

这种情况你需要在外层额外捕获OrderNotFoundException,或者在回调内把自定义异常封装为JdbiException的子类抛出,才能仅靠捕获JdbiException覆盖所有异常。


最佳实践

  • 普通业务场景下如果没有自定义抛异常的需求,仅捕获JdbiException即可满足需求。
  • 如果有自定义抛异常的需求,优先将自定义异常继承JdbiException实现,统一异常处理逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:39:03