如何用相同的try-catch块 Package 不同的方法?

r55awzrz  于 2022-10-22  发布在  Java
关注(0)|答案(1)|浏览(226)

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

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) { .... }

我试图创建一个如下的函数,但我得到了
在try块中从未引发异常e1
如预期的那样。

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

von4xj4u1#

问题是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);

相关问题