これはインタビューの質問です。スタックの巻き戻しがすでに進行中の場合、プログラムが終了する可能性があることを彼に伝えました。それ以外に、例外が適切に処理されていることを考えると、問題はありますか。適切に処理されている限り、私は彼にノーと言いました.しかし、彼は私の反応にあまり満足していないようでした.
3 に答える
アクティブな例外が既に存在するかどうかを知る方法はありません。存在する場合、デストラクタから別の例外をエスケープさせると、プログラムは終了します。
したがって、私はあなたの主張にはあまり従いません。
それが適切に処理される限り、私は彼にノーと言いました。
そもそもデストラクタからエスケープさせない以外に、どうすれば「適切に処理」できますか? もし私がインタビュアーだったら、それが私の次の質問だったでしょう。
デストラクタからスローしても意味がありません。
デストラクタで唯一回復可能な種類のエラーは、ファイルのクローズ/フラッシュ中の I/O エラー (またはネットワークに関する同様のエラーなど) です。しかし、これらの状態からの回復は簡単です。エラーを報告して続行してください。いずれにせよ、そのファイルは必要ありません。ファイルを閉じようとしただけです! 必要のないファイルのエラーのために、何をしていたとしても放棄するのはもったいないです。
ミューテックスのロックを解除できない、メモリのブロックを解放できないなど、デストラクタで発生する可能性のある他のすべての種類の障害は、おそらく回復できず、terminate()
.
一方、リソースの割り当てエラー、または計算の途中での I/O の失敗は、計算を続行できないため、例外をスローする必要があります。しかし、これはデストラクタで発生するべきではありません。または、発生する場合は、デストラクタ内で処理する必要があります(なぜですか?繰り返しますが、伝播させても意味がありません。これはエラーを停止せず、可能性のある計算を放棄します)。楽しく続けます)。
そのため、デストラクタからのスローが完全に安全で明確に定義されていたとしても、それほど多くはありません。
デストラクタからスローしている場合、これは例外が実際にデストラクタを離れていることを意味します。したがって、適切に処理される部分は問題外です。それがどのように処理されるかを知る方法はありません。
さらに微妙な問題があります。多くの重要なケースでは、デストラクタがスローしないと想定されない限り、例外セーフ コードを作成することは不可能です (または、少なくとも非常にコストがかかります)。デストラクタがスローすると、クラスのユーザーはそれを使用して適切なコードを記述できなくなります。たとえば、コンテナに含まれるオブジェクトのデストラクタがスローしないことが保証されていない限り、コンテナに対して例外セーフなデストラクタを作成することはできません。への呼び出しはありませんterminate()
が、コンテナ デストラクタはリソースをリークします。