这是在Java 6上
我是否可以使用常用方法来处理异常 - 所以不要在每个方法中执行n次
try {
// Do something
} catch (XException e) {
// Do something
} catch (YException e) {
// Do something
} catch (ZException e) {
// Do something
}
我有
try {
// Do something
} catch (Exception e) {
handleAll (e);
}
和方法handleAll(e)
if e.instanceOf(XException)
else if e.instanceOf(YException)
else if e.instanceOf(ZException)
第二种方法有什么问题吗?
更新
我最初的问题是关于“集中处理”在一个地方对于已检查和运行时异常。答案指出我应该避免使用instanceof()。
@ aioobe的想法看起来很整洁。对这种方法有任何负面意见吗?
答案 0 :(得分:4)
我看到它有一个小问题。由于您确实希望handleAll
方法重新抛出任何未捕获的异常,因此必须将其声明为throws Exception
。这意味着调用handleAll
的方法也是如此。
如果X-
,Y-
和ZException
都是RuntimeExceptions
,我认为这没有错。 (我可能忽略了一些东西,因为这是我第一次看到这种方法。)
为了确保instanceof
方法的行为与catch子句完全相同,我会考虑设计handleAll(RuntimeException e)
这样的方法:
private void handleAll(RuntimeException e) {
try {
throw e;
} catch (XException xe) {
...
} catch (YException xe) {
...
} catch (ZException xe) {
...
}
}
答案 1 :(得分:2)
这是一种糟糕的方法。它将减少LOC(代码行),但它会产生难以理解,更依赖于资源(它需要更多的内存和处理能力)。它也降低了可读性。
所以第一个是最好的
答案 2 :(得分:1)
你可以这样做,但我不认为它是好的编码风格。将异常处理程序保持在抛出Exceptions的行附近很方便。 假设您的代码发生了变化,并抛出了一个新的异常。然后你必须更新处理它们的方法;所以现在你必须在两个地方做出改变。如果代码不再抛出特定的异常,或者您决定应在更高级别处理某些异常,则会发生同样的情况。
另外,我对“捕获(Exception exc)”持谨慎态度。它太笼统了,尽量让你的Exception处理程序尽可能具体。
答案 3 :(得分:1)
Java 7将使事情变得更好。因为catching multiple exceptions是可能的。
答案 4 :(得分:0)
第二种方法确实有问题:如果被调用的方法签名被修改并抛出一种新的异常,代码仍然可以正常编译,而你没有正确处理这个新的异常。
使用第一种方法,编译器将产生错误,这将强制您处理新的异常。
答案 5 :(得分:0)
第二种方法将捕获所有Exception
,包括RunTimeException
。确保你正确处理它们。
答案 6 :(得分:0)
我认为每个异常都是唯一的(当代码中的比较位置,而不是抛出异常的时候),因此您不应该将异常处理通知。
你可能希望每次IE都处理异常差别很小。如果某个地方抛出了FileNotFoundException,你可能会创建一个新文件,但其他时间可能会导致应用程序终止的致命异常。