【初心者】Java質問・相談スレ20【大歓迎】
レス数が950を超えています。1000を超えると書き込みができなくなります。
0977デフォルトの名無しさん
NGNG懐かしいネタだな。書き方の好みの問題ではなく >>953 の方がより好ましいと説明した
のは 1 年くらい前だったか。あの時はファイルの open/close の話だったかな。
リソースの開放に関しては >>952 でも >>953 でも滞りなく行われるだろう。ここで問題
なのは try-catch ブロック内で例外が発生し、その影響で finally 内のリソース開放
処理も例外になった場合だ (多重障害)。>>952 のように記述した場合、外側 catch で
捕らえられるのは「クローズに失敗した」という副作用的な情報だけである。つまり、
障害の根本原因の情報が副作用的な情報によって上書きされてしまうという弊害が出る
可能性がある。
try{
SomeResource resource = getSomeResource();
try{
// このブロックのどこかで例外が発生
} finally {
resource.close(); // その影響でこの処理も例外
}
} catch(SomeException ex){
// ここで捕らえられる例外は close に失敗したという情報であり、try ブロック
// 内で発生した例外ではない
}
ここでの話の焦点はかなりのレアケースである。だからこそ、書き方の好み云々ではなく
本番運用中の一発勝負で障害解析ができるだけの配慮がなされているかが重要と思われる。
でも >>953 でも finally 内の catch ブロックで printStackTrace() くらいやっとい
てもよかったかもな。
また 1 年後くらいに同じネタが振られそうな悪寒。
レス数が950を超えています。1000を超えると書き込みができなくなります。