次の 2 つの 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 ....
}
}
私の知る限り、finally と catch フレーズのコードがそのままであると仮定すると、try ブロックでラップされた try-catch ブロックが finally で try-catch-finally ブロックと意味的に同じであるかどうかに要約されます。同じで、外側の try ブロックは内側のブロックの結果を昇格させるだけです。
実用的な関連性: try-catch-finally を使用しないコード ベースがあり、使用すべきときに、何らかの理由でそのコードにアクセスできない場合、追加するラッパー メソッドのレイヤーを多かれ少なかれ機械的に生成することができます。最後に。
多くの理由から、可能な限り try ... catch ... finally を使用する必要があるという事実を十分に認識しています。具体的には、最初の例を 2 番目の例のようにリファクタリングするように提案しているわけではありません。
むしろ、例 2 を安全に例 1 にリファクタリングできるようにしたいと考えています。