消费者附上尝试捕获逻辑不起作用

时间:2018-09-07 14:58:55

标签: java-8 try-catch dry

我正在重构一些旧代码,遇到了这个功能:

ReadAsAsync<>

我的常识对我说,为了保持“不要重复自己”的原则,我应该包装这种try-catch逻辑,所以我引入了此更改:

private static void parseOptionalValues(Product product, Input source) {
    try {
        product.setProductType(...some operation with source...);
    } catch (IllegalArgumentException ignored) {}
    try {
        product.setMaterial(...some operation with source...);
    } catch (IllegalArgumentException ignored) {}
    try {
        product.setUnitPricingBaseMeasure(...some operation with source...);
    } catch (IllegalArgumentException ignored) {}
    try {
        product.setUnitPricingMeasure(...some operation with source...);
    } catch(IllegalArgumentException ignored){}
}

我正在运行一些单元测试和调试,但是由于未捕获private static void parseOptionalValues(Product product, Input source) { setOptionalParameter(...some operation with source..., product::setProductType); setOptionalParameter(...some operation with source..., product::setMaterial); setOptionalParameter(...some operation with source..., product::setUnitPricingBaseMeasure); setOptionalParameter(...some operation with source..., product::setUnitPricingMeasure); } private static <T> void setOptionalParameter(T value, Consumer<T> consumer) { try { consumer.accept(value); } catch (IllegalArgumentException ignored) {} } 却引发了IllegalArgumentException,因此代码无法像以前那样运行。

关于如何解决这种将try-catch逻辑封装在一个地方的想法吗?

1 个答案:

答案 0 :(得分:3)

我认为问题可能出在将参数传递给setter的代码引发了异常。因此,一种可能的方法是通过使用Supplier使该部分代码 lazy ,然后在{{1}内的.get()上调用Supplier }}阻止(以及调用try/catch):

Consumer

您可以按以下方式调用该方法:

private static <T> void setOptionalParameter(
        Supplier<? extends T> supplier, 
        Consumer<? super T> consumer) {

    try {
        consumer.accept(supplier.get());
    } catch (IllegalArgumentException ignored) {
    }
}

请注意,我已经改进了您方法的签名,以使其现在分别接受setOptionalParameter(() -> ...some operation with source..., product::setProductType); Supplier的更广泛的泛型子类型和超类型。


编辑:根据评论,上述方法可能不够灵活,即,如果该方法接受多个参数,等等。在这种情况下,最好使用{ {1}}实例:

Consumer

现在调用将变为:

Runnable