我有一些函数具有相同的参数和响应类型,如;
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);