我想知道以下两个 swnippest 在语义上是否相同,如果不是,有什么区别(我们假设我们要计算 R 类型的结果,并且要防止在执行过程中可能抛出的异常 X所以):
public R tcf(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
finally {
... clean up ....
}
}
以及以下内容:
public R tc(....) {
try {
R some = ...;
... compute the result ....
return some;
}
catch (X exception) {
... exception handling ....
}
}
public R tf(....) {
try {
return tc(....); // wrap the try-catch in tc()
}
finally {
... clean up ....
}
}
据我所见,它归结为如果包装在 try 块中的 try-catch 块与 finally 在语义上与 try-catch-finally 块相同,假设 finally 和 catch 短语中的代码保持不变同样,外部 try 块只是提升内部块的结果。
实际相关性:给定一个不使用 try-catch-finally 的代码库,什么时候应该使用,并且由于某种原因,人们无法触及该代码,因此可以或多或少地机械地生成一层包装方法,以添加最后。
我完全了解这样一个事实,即出于多种原因,应该尽可能使用 try ... catch ... finally。具体来说,我不建议以任何方式重构第一个示例,使其看起来像第二个示例。
相反,我想确保示例 2 可以安全地重构为示例 1。