セマンティクスに関しては、try-catch コンストラクトを配置するメソッドを決定した場合 (そして、その決定を正しく行ったことに満足している場合)、答えはかなり単純です。
try
一連のステートメントをブロックに含める必要があります。これらのステートメントの 1 つが失敗した場合、残りのシーケンスは破棄されます。それ以上でもそれ以下でもありません。
上記のアドバイスに正しく従えば、目的のプログラム フローやローカル変数の最も効率的なスコープなどの問題は、(ほとんどの場合) 非常に簡単かつ明確に解決されます。try
これは、ネストされたブロックの可能性を排除していないことに気付くでしょう。
パフォーマンスに関しては、例外処理のオーバーヘッドは、スロー可能なオブジェクトを実際にスローしてキャッチすることにあります。つまり、実際にオーバーヘッドが発生するのは、例外が実際に発生した場合のみです。コード内に try-catch コンストラクトが存在するだけでは、測定可能なオーバーヘッドは発生しません (まったく発生しない可能性があります)。また、(特定の try-catch コンストラクト内の) ステートメントの量は、そのパフォーマンスとはまったく関係ありません。
編集:リンクするJVM仕様の詳細を見つけることができませんでしたが、生成されたバイトコードを調べて説明するユーザーによる多くの投稿があります.興味深い結果)。私には、Java コンパイラーが出力をできるだけ少なくしようとしているように見えます (もちろん、try
およびcatch
句と、これらの句をジャンプしたり例外オブジェクトをポップしたりするためのいくつかの避けられないプログラム フロー命令)。例外がキャッチされる候補となる場所を見つける責任は VM に委ねられます。これにより、例外が実際に発生するシナリオにより多くの負担がかかる可能性が高くなりますが、ご存知のように、例外は例外的なケースのためのものであり、とにかくフローを制御するものではありません。
C++ 例外が一般的にどのように実装されているかはわかりませんが、C++ プログラムは通常 VM の助けを借りて実行されないことを考えると、例外が Java と根本的に異なることは非常に合理的です。