如何将Java方法中的try catch提取到外部以提升代码整洁性
代码优化方案
Bob大叔提出的「抽离try/catch代码块」核心逻辑是将异常处理这类副作用代码和核心业务流程分离,主方法仅保留业务逻辑主干,大幅提升可读性,你可以按照以下步骤落地:
1. 封装通用异常处理逻辑
你现有的两个try/catch逻辑高度统一:执行操作、捕获异常、打印错误日志,我们可以把这部分公共逻辑抽成通用工具方法,避免重复编写:
// 无返回值的运行逻辑封装 @FunctionalInterface interface ThrowableRunner { void run() throws Exception; } // 有返回值的运行逻辑封装 @FunctionalInterface interface ThrowableSupplier<T> { T get() throws Exception; } // 无返回值场景的异常处理方法 private void runWithErrorLog(ThrowableRunner runner) { try { runner.run(); } catch (Exception e) { this.logger.log(Level.ERROR, e); } } // 有返回值场景的异常处理方法,异常时返回预设默认值 private <T> T supplyWithErrorLog(ThrowableSupplier<T> supplier, T defaultValue) { try { return supplier.get(); } catch (Exception e) { this.logger.log(Level.ERROR, e); return defaultValue; } }
你可以根据自己项目的规范,把这部分代码放在当前类或者公共工具类中。
2. 重构原业务方法
重构后原方法内不需要再写任何try/catch代码,仅保留核心业务流程,完全和原代码的业务行为一致:
public void sendParameterValueAsMQTTMessage() { // 序列化JSON,异常时返回null,和原逻辑完全对齐 String payload = supplyWithErrorLog( () -> convertToJSONString("range", String.valueOf(range)), null ); MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC, payload, 0); // 执行消息发布+休眠逻辑,异常自动打印日志 runWithErrorLog(() -> { this.client.publish(message); Thread.sleep(3000); }); }
可选进阶优化
如果想要进一步提升代码清晰度,可以把每个独立的业务步骤再拆分为单独的小方法,最终主方法可以简化为仅保留流程主干:
public void sendParameterValueAsMQTTMessage() { String payload = buildRangePayload(); MQTTMessage message = new MQTTMessage(MQTTTopics.RANGE_TOPIC, payload, 0); publishRangeMessage(message); } // 拆分后的payload构建方法,异常处理逻辑隐藏在内部 private String buildRangePayload() { return supplyWithErrorLog( () -> convertToJSONString("range", String.valueOf(range)), null ); } // 拆分后的MQTT发布方法,异常处理逻辑隐藏在内部 private void publishRangeMessage(MQTTMessage message) { runWithErrorLog(() -> { this.client.publish(message); Thread.sleep(3000); }); }
内容的提问来源于stack exchange,提问作者Angel Hadzhiev
相关产品推荐
相关产品推荐

