调用Jdbi的withHandle方法仅捕获JdbiException是否安全?
结论
分两种场景判断:
- 若你传入
withHandle的回调逻辑仅调用Jdbi API、没有主动抛出自定义异常,仅捕获JdbiException完全安全,可以覆盖withHandle抛出的所有异常。 - 若你在回调逻辑里主动抛出了非Jdbi体系的自定义异常,仅捕获
JdbiException会漏掉你自定义抛出的异常。
原理说明
- 官方定义的
JdbiException是Jdbi框架自身抛出的所有异常的父类,所有框架层面的错误(包括SQL执行错误、结果映射错误、数据库连接错误、数据查询不存在等)都会以JdbiException或其子类的形式抛出,不会抛出其他非Jdbi体系的异常。 - 你看到的方法签名
<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
相关产品推荐
相关产品推荐

