私はC++が初めてで、次の問題について少し混乱しています:
DTOR が例外をスローするとどうなりますか? オブジェクトはまだ破棄されていますか?
前もって感謝します。
そして一般的に:それは悪い考えですか?
はい、非常に悪いものです。
デストラクタから例外をスローしないでください。別の例外がスローされた後、その例外がcatch
ハンドラーによってキャッチされる前に例外がスローされた場合、プログラムは強制的に強制終了されます。
デストラクタは、例外がスローされたときにスタックの巻き戻し中に呼び出されるため、それらのいずれかが別の例外をスローすると、プログラムはすぐに終了します。よくない。
デストラクタから例外をスローしないようにします (またはtry
/ブロックにラップして、デストラクタの外に伝播catch
しないようにします)。そうすることは、悪いプログラミング方法です。
C++11標準のパラグラフ15.2/3から:
try ブロックから例外がスローされるポイントまでのパス上に構築された自動オブジェクトのデストラクタを呼び出すプロセスは、「スタックの巻き戻し」と呼ばれます。スタックの巻き戻し中に呼び出されたデストラクタが例外で終了した場合、std::terminate が呼び出されます (15.5.1)。[ 注:したがって、デストラクタは通常、例外をキャッチし、デストラクタの外に伝播させないようにする必要があります。—終わりのメモ]
はい、それは悪い考えです。安全に投げられるかどうかを判断する合理的な方法はありません。