首先,甚至可以被视为候选人的唯一成语是:
try {
// stuff
} catch (Throwable t) {
// handle
}
// finally stuff
注意被捕获的类型。只有当你捕捉到任何可能的异常,包括像这样的黑暗怪物,ThreadDeath
你VirtualMachineError
才能希望无条件地到达 try-catch 下面的代码。
但是,这只是开始的地方。如果处理代码本身抛出异常怎么办?所以你至少需要
try {
// main stuff
} catch (Throwable t) {
try {
// handle
} catch (Throwable t) {
// no code allowed here! Otherwise we descend into
// infinite recursion
}
}
// finally stuff
现在您可能开始意识到 的好处finally
,但这还不是全部。考虑一个非常典型的场景:
try {
// main stuff, may throw an exception. I want the exception to
// break what I'm doing here and propagate to the caller.
return true;
} finally {
// clean up, even if about to propagate the exception
}
你如何重写这个?没有代码重复,是不可能的。