Java:确切的异常类型有多重要

时间:2013-02-18 08:07:08

标签: java exception exception-handling

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

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。但这可能很麻烦,而且我可能不会多次使用此异常 - 似乎使用预先存在的Exception更为贴切。

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

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

编辑: 一个好的,相关的答案,虽然下面的答案非常好,但是here

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

原因如下

  1. 有些情况需要处理异常并在异常情况下进行一些修复工作。如果出现不同的异常情况,您所做的修复工作可能会有所不同,并且不能采用通用的方法来处理它。因此,在这些情况下,您可以在异常的适当catch块中处理特定情况。
  2. 第二个原因是,如果某个团体正在尝试调用您的方法,如果他们知道可能会抛出一组异常,那么对于第三方将重新使用您的方法有帮助。如果你只是抛出“Exception”或“Throwable”,那么它在天空下变得太通用了。
  3. 要说出一条线,回答问题总是比击败灌木更好