Java异常处理习语...谁说的对,怎么处理?

标签 java exception

我目前和一个熟人有技术上的分歧。简而言之,这就是 Java 异常处理的这两种基本风格之间的区别:

选项 1(我的):

try {
...
} catch (OneKindOfException) {
...
} catch (AnotherKind) {
...
} catch (AThirdKind) {
...
}

选项 2(他的):

try {
...
} catch (AppException e) {
    switch(e.getCode()) {
    case Constants.ONE_KIND:
    ...
    break;
    case Constants.ANOTHER_KIND:
    ...
    break;
    case Constants.A_THIRD_KIND:
    ...
    break;
    default:
    ...
    }
}

他的论点——在我使用大量关于用户输入验证、异常处理、断言和契约等的链接来支持我的观点之后——归结为:

“这是一个很好的模型。自从我和我的一个 friend 在 1998 年提出它以来,我就一直在使用它,差不多 10 年前。再看一眼,你会发现我们对学术论点所做的妥协很有道理。”

对于为什么选项 1 是要走的路,有没有人有充分的论据?

最佳答案

当你有一个 switch 语句时,你就不那么面向对象了。出错的机会也比较多,忘记一个“break;”语句,如果你添加一个新的Exception,忘记为一个Exception添加一个case > 被抛出。

我还发现您的做法更具可读性,而且这是所有开发人员都会立即理解的标准习惯用法。

以我的口味,做你熟人的方法的样板数量,与实际处理异常无关的代码数量,是 Not Acceptable 。实际程序逻辑周围的样板代码越多,代码就越难阅读和维护。使用不常见的习语会使代码更难理解。

但是,正如我上面所说,破坏交易的是,当您修改被调用的方法以使其抛出额外的 Exception 时,您会自动知道您必须修改代码,因为它会失败编译。但是,如果您使用熟人的方法并修改被调用的方法以抛出新种类的 AppException,您的代码将不知道这个新种类有什么不同,并且您的代码可能会默默地失败下一个不适当的错误处理腿。这是假设您确实记得输入默认值,所以至少它已被处理并且没有被默默地忽略。

关于Java异常处理习语...谁说的对,怎么处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/609293/

相关文章:

java - 增加 Gridlayout 中的行大小

java - 为什么类型参数 Entry 隐藏类型 Map.Entry?

Java bean- 返回类型

Windows Driver BugCheck 7E 在驱动程序加载时

java - try catch block 中预期的标识符

java - 如何从以下cataLog中找到异常?

java - 有关具有两个指针的 while 循环的问题

java - 如何使用带有嵌套 if-else 语句的 switch 语句输出日期

exception - 可移植地处理 C++ 中的异常错误

java - 在检查套接字的连接时从 BlueToothSocket 的 InputStream 中畅通读取