私は例外クラスを持っています:
class MyException : public std::exception
{
public:
MyException( char* message )
: message_( message )
{
if( !message_ ) throw std::invalid_argument("message param must not be null");
}
};
そして、私のスローサイトで:
try {
throw MyException( NULL );
}
catch( std::exception const& e ) {
std::cout << e.what();
}
(コードはコンパイルされていないため、エラーが発生した場合はご容赦ください)
別のスローのために構築中にコンストラクターからスローするとどうなるのだろうかと思っています。これは合法であり、catch は をキャッチすることstd::invalid_argument
になり、前にスローされた例外 ( MyException
) は無視されるか取り消されると思います。
この設計の目標は、例外クラスに不変条件を適用することです。message_
決して NULL であってはならず、オーバーロードで null かどうかを if 条件でチェックしたくないwhat()
ので、コンストラクターでそれらをチェックし、無効な場合はスローします。
これは正しいですか、それとも動作が異なりますか?