例外を抑制しても情報が失われないということは間違いありません。あなたの同僚の心配は根拠がありません。 try-と資源のポイントは以下のとおりです。
リソースが閉じ得ることを確認するために、関係なく、それらを使用しながら、スローされたものの、それらが宣言されている順序と逆の順序で、
は近くにスローされた例外が迷子にtryブロックでスローされた例外が発生していないことを確認し、そして
は何も情報が失われないように、例外は依然として抑制例外として保持します近くに投げられていることを確認します。
リソースをクローズすると例外がスローされる場合は、どちらの場合でも実行できません。 JDBCでは、データベース・オブジェクトはデータベース・サーバーに通信してリソースの割り当てを解除するよう指示し、クローズに失敗した場合はオープンしたままになります。 (問題は通常、ネットワークや接続に関して何かが変わったためですが、通常は再試行は無意味です)。しかし、サーバーはそれらを最終的にはクリーンアップし、クライアントコードの手には入りません。リソースの試行と試行錯誤の両方のイディオムは、リソースを閉じるという点でも同じように優れています。試行錯誤のイディオムを使用するだけで作業が増えます。
try-with-resourcesを使用するか、try-finallyステートメントをネストするかの違いは、前者の場合、tryブロックに何もスローされずに何かがスローされると、スローされた例外クローズされます(抑制された例外としてそれをアタッチするtryブロックには例外がスローされないため)。ネストされたtry-finallyブロックを使用すると、クローズ時にスローされた例外がfinallyブロックから伝播しないようにすることができ、リソースを解放している間断的なネットワークの不具合が有効なビジネストランザクションを失うことはありません。
実際には、この種のネストの許容範囲を持つ人はほとんどなく、リソースリーク(通常はfinallyブロックの以前の呼び出しが失敗したために閉じられない接続)につながるショートカットを使用します。また、クローズ時にスローされた例外は、try-block内でスローされた例外が失われる例外マスキング(第2の箇条書きで言及されている)を引き起こすコードを書く傾向があります。 try-with-resourcesはこの種のエラーを防ぎます。間違いなく、リソースを試そうとする場所があります。
私のアドバイスは、例外処理に関するすべてのことを学び、例外の仕組みを示すサンプルプログラムを作成し、両方のアプローチの強みと弱みを理解して、それらについて詳しく話し合い、比較して対比できるようにすることです。そうすれば、あなたの同僚が抱く懸念を理解していることを示すことができます。また、より良いソフトウェアを作成するのに役立つ解決策をグループで見つけられるよう、アドバイスを与えることもできます。
あなたの問題は何ですか?あなたの同僚を納得させるには? –
"リソースを閉じようとしているときに例外がスローされたとします。リソースが開いてリークする可能性はありますか?これは、Java 7以前のtry/finallyコードと同じ程度に開いたままになります。私はあなたが何回も何回も閉じようとしているとは思わないでしょうか? –
抑制された例外は、すべてで失われません_。 [このプレゼンテーション]のスライド8(https://docs.google.com/presentation/d/10mD-_M_fXOU3LOP5hmqVTlcJhgn5FUCwTLIdor2Z4qM/edit?usp=sharing)を参照してください。 – fge