【问题标题】:Is the same code with different exception handling considered as repeated code?相同的代码具有不同的异常处理是否被视为重复代码?
【发布时间】:2014-12-02 18:10:17
【问题描述】:

在重构我的代码时,我意识到一些代码是重复的,除了它们的异常处理。我想知道这些代码是否被认为是重复重构,如果是,如何?

具体样本: 例如,我有两种方法。

void fun1() {
    try {
        foo();
    } catch (Exception ex) {
        handle1();
    }
}

void fun2() {
    try {
        foo();
    } catch (Exception ex) {
        handle2();
    }
}

【问题讨论】:

  • 您能否尝试提供一个更完整的示例来说明为什么您需要将异常处理包装在两个单独的(否则相同的)函数中?对我来说,这似乎通常表明设计不佳,可以在其他地方修复,但很难说。
  • 我知道从不建议捕获一般异常。但是,我面临的问题可能是。我正在捕获相同的异常类型,但在 fun1() 和 fun2() 中。我确实有不同的处理机制
  • 那么你会(理论上)以不同的方式处理相同的异常类型吗?例如。在 fun1 用例和 fun2 用例中,RuntimeException 的处理方式会有所不同吗?
  • 说我正在写一些测试。相同的代码在不同的测试中,我打算有不同的logs/data-chart/error-logs,所以基本上捕获相同的异常类型,但处理方式不同
  • 这似乎是一种可以通过多态性解决的问题 - 只需重载您的 handle 方法,对吗?

标签: java coding-style


【解决方案1】:

为什么不这样做:

try {
        foo();
    } catch (Exception1 ex) {
        handle1();
    } catch (Exception2 ex) {
        handle2();
    }

【讨论】:

  • 我知道从不建议捕获一般异常。但是,我面临的问题可能是。我正在捕获相同的异常类型,但在 fun1() 和 fun2() 中。我确实有不同的处理机制
  • 是的,如果您想捕获相同的异常,但根据调用的方法以不同的方式处理它,您可以保留它的方式...
【解决方案2】:

好的,首先,捕获所有Exceptions 是一个坏习惯,你不应该真的这样做,只捕获你期望的那些。

我不会认为它是重复的,因为在一种情况下,您可能期望在另一种情况下出现一个异常,您可能期望另一个异常。这是在你的 catch 子句中具体化的另一个原因。然后,您还可以使用 multicatch 语句,如下所示:

void fun() {
    try {
        foo();
    } catch (MyFirstException ex) {
        handle1();
    } catch (MySecondException ex) {
        handle2();
    }
}

【讨论】:

    【解决方案3】:

    这里有一些重复,但不多。通过将预期的错误处理函数作为参数传递给辅助方法,您可以更好地整合代码。请注意,这在 Java 8 之前会更加冗长。

    void fun1() {
        funHelper(this::handle1);
    }
    
    void fun2() {
        funHelper(this::handle2);
    }
    
    void funHelper(Runnable errorHandler) {
        try {
            foo();
        } catch (Exception ex) {
            errorHandler.run();
        }
    }
    

    【讨论】:

    • 在 java8 中有什么方法可以做到这一点?
    • @user3393757:免责声明:我实际上没有使用过 Java 8,所以我的语法可能有一些错误。
    • @user3393757:我在这里发布的方式是理论上它应该如何在 Java 8 中工作。在 8 之前的版本中,您必须创建 Runnable 的匿名实现,其 run 方法致电handle1handle2。在 Java 8 中,您应该能够只传递对方法的引用,而编译器会计算出其余部分。
    • @user3393757:我刚刚修复了至少一个语法错误。传递方法引用时需要使用:: 运算符。
    猜你喜欢
    • 2013-07-08
    • 2017-10-20
    • 2017-09-13
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多