特殊例外与例外

时间:2016-04-28 22:03:49

标签: java exception-handling

这可能是一个非常愚蠢的问题,但我试图理解为什么它很重要。为什么使用特定异常而不是仅使用Exception很重要。这是一个例子:

List<String> testList = new ArrayList<String>();

try {
    testList.add(1, "String");
} catch (IndexOutOfBoundsException ex) {
    ex.printStackTrace();
}

上面的例子有一个特殊的例外情况。为什么让IndexOutOFBoundsException而不是仅使用Exception很重要。我知道将ExceptionprintStackTrace()一起使用会向您显示实际引发的异常。

1 个答案:

答案 0 :(得分:4)

这是一个很好的问题,但这也是一个很大的问题。在着名的书“ Effective Java ”中,Joshua Bloch将一整章专门用于Exception最佳实践。他的一个与此相关的建议是:

  

对可恢复条件使用已检查的异常,对编程错误使用运行时异常。

这与您发布的代码相关的原因是,通过捕获异常,您忽略了&#34;可恢复条件之间的区别&#34;和#34;编程错误&#34;。你在说,&#34;我不在乎什么是错的,我会去处理它。&#34;

虽然这种处理有时间和地点,但它通常处于应用程序的最高级别。例如,在未处理的异常情况下,许多Web应用程序框架向用户显示漂亮的错误页面。他们使用类似于catch Exception的某种机制来实现此目的,以提供更好的用户体验并防止整个Web应用程序框架崩溃。

另一方面,如果一些粗心的开发人员在catch Exception处于低级别代码的某个地方,然后发现了一个他并不意味着的例外,那么应用程序很可能会破坏其他方式,恶化用户体验和调试变得更加困难。

另见

  • Effective Java ,第二版,Joshua Bloch撰写
    • 项目58:对可恢复条件使用已检查的异常,并为编程错误使用运行时异常
    • 第61项:抛出适用于抽象的例外[这也意味着捕获适用于抽象的例外]
    • 第65项:不要忽略异常[捕获异常就像忽略一整类可能的错误]