除了以不同方式处理不同异常的明显情况之外,单独处理异常是否有任何好处?我看到很多代码看起来像以下几行:
try {
doSomethingThatMayThrowExceptions();
} catch (SomeException e) {
} catch (OtherException e) {
}
当我只有一个异常处理过程时,我总是倾向于捕获通用Exception
。
派生的问题是:如果它只是一个,它是否更好地陈述您正在捕获的确切类型的异常?例如:
try {
number = Integer.parseInt(numberString);
} catch (Exception e) {
// ...
}
在上面的示例中,try
块只能抛出NumberFormatException
。在这里捕获通用Exception
是否有任何缺点?
答案 0 :(得分:5)
在上面的例子中,try块只能抛出NumberFormatException。在这里捕获通用异常是否有任何缺点?
不是真的。但是可以问一下,“隐藏”确切的例外是什么?
如果你抓住NumberFormatException
,你可以立即看到预期会抛出哪些异常。
编辑:请原谅我。上面的例子也可以抛出未经检查的异常,即。 NPE,所以你实际上捕获更多异常并以同样的方式对待它们。实际上,您可能希望为这些异常实现不同的异常处理(如果您甚至想要捕获和处理未经检查的异常)。
答案 1 :(得分:3)
捕获异常将导致捕获未经检查的异常以及已检查的异常,可能是您不期望的异常。这可能导致您的异常处理尝试以您想要的方式管理情境。
答案 2 :(得分:1)
对我而言,这是一个维护的事实,如果你在一年前写了一个应用程序,并且生成了一个异常并且你看了代码,那么很难看到throws Exception
/ } catch (Exception e) {
,然后我需要读取方法中代码的所有javadoc,以查看抛出的异常类型。
所以我倾向于捕捉特定类型的异常以了解我正在处理的内容。
另一个例子可能是SQLException
。在某些情况下;取决于sqle的errorCode
,我想重试数据库操作,而在任何其他类型的异常中我想中止并报告。
答案 3 :(得分:0)
不,它确实归结为只是为了让你有不同可能的意外情况的捕获条件。作为一般规则,仅捕获Exception是不好的,因为某些操作可能会导致您需要捕获IOException和SQLException,每个操作都需要非常不同的错误处理。
在大多数情况下,您实际上需要一个用于Exception的catch块,以便您拥有一个通用错误处理程序,您可以在其中清理并引发一般程序错误。虽然这应该在try-catch-block中的特定情况之后出现。