C++ の例外について、はい/いいえの質問が 3 つあります。
例外クラスは、標準ライブラリで定義されている例外クラスから派生する必要がありますか?
などの関数で例外がスローされた
f()
が、そこで処理されなかった場合、例外は を呼び出した関数に伝播されf()
ます。本当ですか?例外オブジェクトは、ユーザー定義型または C++ に組み込まれている任意の型にすることができます。これは本当ですか?
(1) 例外クラスは、標準ライブラリで定義されている例外クラスから派生する必要がありますか?
int
基本的な型 (例: ) や C 文字列など、事実上、すべてを例外としてスローできます。スローする例外がクラス型の場合、15.1/5 C++11 で定義されている条件のみがあります。
スローされたオブジェクトがクラス オブジェクトの場合、コピー/移動操作が省略されていても (12.8)、コピー/移動コンストラクタとデストラクタにアクセスできる必要があります。
(2) などの関数で例外がスローされた
f()
が、そこで処理されない場合、例外は を呼び出した関数に伝播されf()
ます。本当ですか?
try...catch
句内からスローcatch
され、例外タイプ (またはクラス階層内のその祖先) に一致するステートメントが定義されている場合、例外はキャッチされます。それ以外の場合 (またはキャッチされて catch ステートメント内から再スローされた場合)、実際には呼び出し元の関数に伝播され、そこで同じ方法で再帰的に処理されます。
(3) 例外オブジェクトは、ユーザー定義型または C++ に組み込まれている任意の型にすることができます。これは本当ですか?
はい。ただし、上記 (1) に記載されている場合を除きます。クラス型の場合、コピーおよび移動コンストラクタとデストラクタにアクセスできる必要があります。(ユーザー定義である必要はありませんが、アクセス可能である必要があります。つまり、プライベートではありません。)