2016-04-26 10 views
5

今、私の仕事では、リソースの試行と例外の抑制に関する議論があります。Java Try-With-Resources Debate

クイックリキャップ:Java 7のtry-with-resourcesは、リソースを閉じるための厄介なfinallyブロックの必要性を排除します。私は個人的にそれがよりエレガントな感じですが、私は確信していない同僚がいます。彼は1つの例外が抑制されることを好まないし、それを通して情報を失うと主張している。

私は初心者だったので彼の言葉を取っていました。彼は上級者です。私は新人です。しかし、最近私はちょっと知っていました。すべての情報が、抑制された例外。だから情報はそこに失われない。

私が探しているこの議論の最後の部分(私は試してリソースと提唱しているので)は、その例外を自動クローズ可能に処理する方法です。リソースを閉じようとしているときに例外がスローされたとしましょう。リソースが開いて漏れる可能性はありますか?とにかくこの問題にログが記録されるため、最終的にはそれほど大きな問題ではないかもしれません。

好奇心が強い。本当にありがとう。

+2

あなたの問題は何ですか?あなたの同僚を納得させるには? –

+2

"リソースを閉じようとしているときに例外がスローされたとします。リソースが開いてリークする可能性はありますか?これは、Java 7以前のtry/finallyコードと同じ程度に開いたままになります。私はあなたが何回も何回も閉じようとしているとは思わないでしょうか? –

+1

抑制された例外は、すべてで失われません_。 [このプレゼンテーション]のスライド8(https://docs.google.com/presentation/d/10mD-_M_fXOU3LOP5hmqVTlcJhgn5FUCwTLIdor2Z4qM/edit?usp=sharing)を参照してください。 – fge

答えて

8

例外を抑制しても情報が失われないということは間違いありません。あなたの同僚の心配は根拠がありません。 try-と資源のポイントは以下のとおりです。

  • リソースが閉じ得ることを確認するために、関係なく、それらを使用しながら、スローされたものの、それらが宣言されている順序と逆の順序で、

  • は近くにスローされた例外が迷子にtryブロックでスローされた例外が発生していないことを確認し、そして

  • は何も情報が失われないように、例外は依然として抑制例外として保持します近くに投げられていることを確認します。

リソースをクローズすると例外がスローされる場合は、どちらの場合でも実行できません。 JDBCでは、データベース・オブジェクトはデータベース・サーバーに通信してリソースの割り当てを解除するよう指示し、クローズに失敗した場合はオープンしたままになります。 (問題は通常、ネットワークや接続に関して何かが変わったためですが、通常は再試行は無意味です)。しかし、サーバーはそれらを最終的にはクリーンアップし、クライアントコードの手には入りません。リソースの試行と試行錯誤の両方のイディオムは、リソースを閉じるという点でも同じように優れています。試行錯誤のイディオムを使用するだけで作業が増えます。

try-with-resourcesを使用するか、try-finallyステートメントをネストするかの違いは、前者の場合、tryブロックに何もスローされずに何かがスローされると、スローされた例外クローズされます(抑制された例外としてそれをアタッチするtryブロックには例外がスローされないため)。ネストされたtry-finallyブロックを使用すると、クローズ時にスローされた例外がfinallyブロックから伝播しないようにすることができ、リソースを解放している間断的なネットワークの不具合が有効なビジネストランザクションを失うことはありません。

実際には、この種のネストの許容範囲を持つ人はほとんどなく、リソースリーク(通常はfinallyブロックの以前の呼び出しが失敗したために閉じられない接続)につながるショートカットを使用します。また、クローズ時にスローされた例外は、try-block内でスローされた例外が失われる例外マスキング(第2の箇条書きで言及されている)を引き起こすコードを書く傾向があります。 try-with-resourcesはこの種のエラーを防ぎます。間違いなく、リソースを試そうとする場所があります。

私のアドバイスは、例外処理に関するすべてのことを学び、例外の仕組みを示すサンプルプログラムを作成し、両方のアプローチの強みと弱みを理解して、それらについて詳しく話し合い、比較して対比できるようにすることです。そうすれば、あなたの同僚が抱く懸念を理解していることを示すことができます。また、より良いソフトウェアを作成するのに役立つ解決策をグループで見つけられるよう、アドバイスを与えることもできます。

関連する問題