检查异常是否违反了开闭原则?

Ove*_*404 5 java oop software-design open-closed-principle

我有两个已检查的异常:TestException1TestException2以及以下代码:

void p1() throws TestException1{
    p2();
}

void p2() throws TestException1 { 
    p3();
}

void p3() throws TestException1 {}
Run Code Online (Sandbox Code Playgroud)

对p3的签名进行如下编辑是否违反了开闭原则?

void p3() throws TestException1, TestException2 {}
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 3

我想我现在明白你的问题的意思了。(第二次尝试)

严格来说,对类的源代码所做的任何更改都违反了开放封闭原则的“封闭”部分。违规的严重程度取决于变更的性质。

在您的示例中,更改 Java 中的公共 API 方法引发的已检查异常是严重违规。如果不重新编译,很容易导致任何使用该方法的方法出现编译错误...或者Error由于二进制兼容性问题而导致子类异常。事实上,由于p3是由p2和 间接调用的p1,所以您实际上需要更改该类的更多内容才能使其编译。这可能会使 API 变更的范围更大。

所以对于你的问题:

检查异常是否违反了开闭原则?

不完全是。

可以在不违反开闭原则的情况下使用受检异常。然而,向已经“冻结”的 API 方法添加检查异常确实违反了原则1但添加异常的行为才是违规……而不是异常本身,或者一般的检查异常。


1 - 甚至这一点也是有争议的。反之,修复设计缺陷和错误并不违反开放封闭原则。