最初の構文:
tryブロックのスコープは、Member Initializationリストが完了した後に開始されるため、Member Initialization中にスローされた例外は、このtry-catchブロックによってキャッチされません。
2番目の構文:
メンバー初期化リスト中に例外がスローされた場合に、例外をキャッチできるようにします。
3番目の構文:
関数本体内のtryブロックの開始中括弧の間からスローされた例外が適切にキャッチされるようにします。これは、引数の受け渡し中に発生した例外(発生する可能性がある場合)がこのtryでキャッチされないことを意味します。 -キャッチブロック。
そうです、それらは提供する機能がはっきりと異なります。
編集:
コンストラクタとデストラクタで2番目の構文(function-try-block)を使用する際に考慮すべきいくつかのガイドライン:
C ++標準に従って、
catchブロックがスローせず(元の例外を再スローするか、何か新しいものをスローする)、制御がコンストラクタまたはデストラクタのcatchブロックの終わりに達すると、元の例外が自動的に再スローされます。
簡単に言う
と、コンストラクタまたはデストラクタのfunction-try-blockのハンドラコードは、例外を発行して終了する必要があります。
ガイドライン1:
コンストラクターのfunction-try-blockハンドラーには、例外を変換するという1つの目的しかありません。(そして、ロギングやその他の副作用を行うためかもしれません。)これらは他の目的には役立ちません。
デストラクタから例外をスローすることは悪い考えです。理由を知るためにここを見てください。
ガイドライン2:
デストラクタfunction-try-blocksは実際にはまったく使用されていません。彼らが検出するものは決してないはずです。悪意のあるコードのために検出するものがあったとしても、ハンドラーは例外を抑制できないため、それについて何もするのにあまり役立ちません。
ガイドライン3:
コンストラクタまたはデストラクタのfunction-try-blockハンドラではなく、コンストラクタまたはデストラクタ本体内のローカルのtry-blockハンドラでアンマネージリソースの取得を常にクリーンアップします。
標準的なファンの場合:
C ++標準、条項15.3、段落15:
コンストラクターのfunction-try-blockのハンドラーにreturnステートメントが表示される場合、プログラムの形式は正しくありません。
C ++標準、条項15.3、段落16:
コンストラクタまたはデストラクタのfunction-try-blockのハンドラの最後に制御が到達すると、処理中の例外が再スローされます。それ以外の場合、関数は、制御がfunction-try-block(6.6.3)のハンドラーの最後に到達したときに戻ります。function-try-blockの終わりからフローすることは、値のないリターンと同等です。これにより、値を返す関数(6.6.3)で未定義の動作が発生します。
参考資料:詳細と説明については、こちらのリソースを参照して
ください。