Java8下实现安全调用统一记录通用异常的方案咨询
统一封装顺序调用的异常处理
我正在开发一个包含多个顺序外部调用方法的项目,行为如下伪代码所示:
void calls() { add(Integer:a, Integer:b); multiply(BigDecimal:a, BigDecimal:b); sub(Float:a, Float:b); areaOfSquare(Integer: a); }
当前只要其中任意方法抛出异常,后续所有方法都会被中断跳过。虽然可以给每个方法单独套try/catch块,但代码显得冗余繁琐:
try { add(Integer:a, Integer:b); } catch(Exception e) {} try { multiply(BigDecimal:a, BigDecimal:b); } catch(Exception e) {} try { sub(Float:a, Float:b); } catch(Exception e) {} try { areaOfSquare(Integer: a); } catch(Exception e) {}
我打算写一个safeCall方法,把异常处理逻辑封装进去,让调用者不用关心异常处理细节,不过目前对这个方法的构造思路还不清晰,现有尝试的代码如下:
void calls() { safeCall(() -> add(Integer:a, Integer:b)); safeCall(() -> multiply(BigDecimal:a, BigDecimal:b)); safeCall(() -> sub(Float:a, Float:b)); safeCall(() -> areaOfSquare(Integer: a)); } private void safeCall(Supplier<?> function) { try { function.get(); } catch (Exception e) {} }
优化实现
你的思路方向是对的,但当前用Supplier<?>并不贴合场景——Supplier的get()方法要求有返回值,而你的目标方法都是void类型,改用Runnable会更严谨:
void calls() { safeCall(() -> add(a, b)); safeCall(() -> multiply(a, b)); safeCall(() -> sub(a, b)); safeCall(() -> areaOfSquare(a)); } private void safeCall(Runnable action) { try { action.run(); } catch (Exception e) { // 这里可以统一添加异常日志记录,比如用日志框架输出错误信息 // log.error("方法调用发生异常", e); } }
如果需要兼容有返回值的方法,可以重载一个支持Supplier的版本,覆盖更多场景:
// 处理无返回值的方法 private void safeCall(Runnable action) { try { action.run(); } catch (Exception e) { // 统一异常处理逻辑 } } // 处理有返回值的方法,可根据需求返回null或默认值 private <T> T safeCall(Supplier<T> supplier) { try { return supplier.get(); } catch (Exception e) { // 统一异常处理逻辑 return null; // 也可以返回Optional.empty()或业务默认值 } }
这样既保持了代码简洁性,又能统一管控所有方法的异常逻辑,避免重复编写try/catch块。
内容的提问来源于stack exchange,提问作者user3336194
相关产品推荐
相关产品推荐

