1

异常类型的确切类型(实际上在编程语言中)有多重要?假设我有一本书的章节层次结构,并且我使用一种方法来访问这些章节。一种是:

public void chapterSearch(int chapter) {
    try {
    chapterString = this.hierarchy.get(chapter).getText();
    } catch(IndexOutOfBoundsException e) {
    throw new....
        }
}

第二个是这样的:

public void chapterSearch(String chapterString) {
    for(int i = 0; i < this.hierarchy.size(); i++) {
    if(chapterString.equals(this.hierarchy.get(i).getText())) {
        break;
    } else if(i == this.hierarchy.size() - 1) {
        throw new IllegalArgumentException...
        }
    }
}

在第一种方法中,很明显会抛出一个新的IndexOutOfBoundsException. 但是还有IllegalArgumentException你可以使用的,根据javadoc是

抛出以指示方法已传递了非法或不适当的参数。

这似乎也很适合这种情况。我的意思是,在没有这样的章节号的情况下传递一个非常大的章节号对我来说似乎很不合适。或者,如评论中所述,我可以抛出我自己的新异常,ChapterNotFoundException. 但这可能很麻烦,而且我可能不会多次使用此异常 - 看起来使用预先存在的异常可能更合适。

但总的来说,即使在这种情况下IndexOutOfBoundsException仍然是最合适的,或者如果您更愿意,ChapterNotFoundException异常类型的选择通常有多大关系?

我想一旦你经常使用它,创建你自己的异常类型就会很有意义,但如果你不是呢?

编辑:一个很好的相关答案,虽然下面的答案也很好,在这里

4

2 回答 2

3

我认为这取决于您要如何处理异常。如果您希望程序失败,然后再深入研究日志,我会投票

throw new IllegalArgumentException("Unexpected chapter: \"" + chapterString + "\"");

如果你想捕获异常并处理它,那么创建一个ChapterNotFoundException更有意义。然而,如果你想在你的代码中处理它,你应该考虑创建一个布尔方法来检查章节是否存在,并且完全避免处理异常。

于 2013-02-18T08:21:32.990 回答
2

根据良好的编码指南,捕获确切的异常(尽可能)非常重要。

原因如下

  1. 在某些情况下,您需要处理异常并在出现异常时进行一些修复工作。如果出现不同的异常,您所做的修复工作可能会有所不同,并且不能有通用的处理方式。因此,在这些情况下,您可以在适当的异常捕获块中处理特定情况。
  2. 第二个原因是,如果有人试图调用你的方法,如果他们知道一组可能抛出的异常,那么这对第三部分谁将重用你的方法很有帮助。如果您只是简单地抛出 "Exception" 或 "Throwable" ,那么它在天空下变得太笼统而无法处理。

直截了当地说,总比拐弯抹角好

于 2013-02-18T08:14:49.133 回答