如何用相同的try-catch块包装不同的方法



我有一些函数具有相同的参数和响应类型,如;

public ResponseType functionA(ParamType) throws Exception1
public ResponseType functionB(ParamType) throws Exception1

我用相同的重复try/catch块从不同的地方调用这些函数。有什么方法可以减少重复代码吗?

try{
return functionA(obj);
} catch (Exception1 e) { .... }
catch (Exception2 e) { .... }
catch (Exception3 e) { .... }

try{
return functionB(obj);
} catch (Exception1 e) { .... }
catch (Exception2 e) { .... }
catch (Exception3 e) { .... }

我试着创建一个如下的函数,但我得到了

在尝试块中从未抛出异常e1

如预期。

public ResponseType callFunction(Function<ParamType, ResponseType> function, ParamType obj) {
try{
return function.apply(obj)
}catch (Exception1 e) { .... }
catch (Exception2 e) { .... }
catch (Exception3 e) { .... }
}

问题是Function.apply没有被声明为抛出任何异常,因此通常不可能从实现中抛出已检查异常,也不可能在调用站点捕获已检查异常。(忽略评论中提到的异常解决方案。(

然而,Java并没有限制lambda表达式只能与标准函数接口一起使用,因此当您需要处理特定的异常类型时,最好的方法是创建自己的异常类型。

@FunctionalInterface
interface MyFunction {
ResponseType apply(ParamType param) throws Exception1, Exception2, Exception3;
}

这可以以类似于java.util.function.Function:的方式使用

public ResponseType callFunction(MyFunction function, ParamType obj) {
try{
return function.apply(obj);
}
catch (Exception1 e) { throw new RuntimeException("Exception1"); }
catch (Exception2 e) { throw new RuntimeException("Exception2"); }
catch (Exception3 e) { throw new RuntimeException("Exception3"); }
}

(修改为在catch块中抛出运行时异常,以便编译(

调用代码与任何标准功能接口相同:

callFunction(this::functionA, obj);
callFunction(this::functionB, obj);

或者,等效地:

callFunction(param -> functionA(param), obj);
callFunction(param -> functionB(param), obj);

最新更新