2009-06-24 1 views
8

捕捉されたstd :: exceptionは、what()がNULLになることはありますか?C++の例外、what()をNULLにできますか?

e.what()がオーバーヘッド以下であることを確認していますか?

//... 
} 
catch (const std::exception& e) 
{ 
    std::string error; 
    if(e.what()) 
    error = e.what(); 
} 

答えて

13

文字列の内容は実装定義されているので、答えは「はい」と思います。

編集:そうです。標準では、

virtual const char* what() const throw(); 
5 Returns: An implementation-defined NTBS. 

というように、ポインタだけでなく文字列も返さなければなりません。文字列はNULLにできません。他の人が指摘しているように、what()NULLを返す例外を導出するのは簡単ですが、そのようなことがどのように標準適合に適合するかはわかりません。確かに、独自の例外クラスにwhat()を実装している場合、NULLを返すようにすることは非常に悪い習慣と考えています。

より:what()はNULLを返すことができるかどうかのアドレッシングさらに、問題、および類似した刺激的な問題については

、それはNULLにすることができますもちろんExtending the C++ Standard Library by inheritance?

+0

しかし、あなたは何をして、それがちょうどによってキャッチさをoverwridde場合const std :: exception&次にNULLになる可能性があります。 –

+0

それは仮想ですが、悪いプログラマがNULLにする可能性があります。 – JaredPar

+0

面白いです。さて、私はいくつかの人々がstd :: stringとc_str()メソッドを実装するのが好きであることを知っているので、適切に構築されたstd :: stringがNULLを返すことができるかどうか尋ねる必要があります。 (私が作業しているコードベースでこのような状況があり、いくつかのTODOを追加する必要があるかどうかを知りたがっているので、私は尋ねています)。 –

2

を参照してください。

class myexception: public exception 
{ 
    virtual const char* what() const throw() 
    { 
    return NULL; 
    } 
} myex; 
+1

**これは**言語**で可能です(つまり、あなたのコードはコンパイルされます)、これはC++標準によって禁止されています - Neilの答えを参照してください。 IOW、これをしないでください。なぜなら、他人のコードがあなたにこれをしないことを依頼するからです。 –

+0

標準ではstd :: exception :: whatの動作を指定していますが、std :: exceptionから派生したユーザークラスの要件を作成していないようです。 –

5

の場合誰かがstd :: exceptionから継承し、NULLを返すものをオーバーライドした場合、これは可能です。

class CMyException : public std::exception 
    { 
    ... 
     virtual const char * what() const {return NULL;} 
    }; 

標準でニールの優れた発見にもかかわらず、まだNULLをチェックするのが良いかもしれません。 std :: exceptionの子クラスの仕様はNULLを返すべきではありませんが、あなたのコンパイラの中にはこれを強制するものはなく、上記のコードは言語によっては合法です。これはアサートを使用するために理想的な状況であってもよい

...

assert(except.what() != NULL); 

または

if (except.what() != NULL) 
{ 
     ... normal processing ... 
} 
else 
{ 
     assert(false); 
} 

これが何かは、おそらくこれまでに発生してはならない場合があり、そしてあなたはそれを想定しているので、起こらないはずですが、あなたの前提が間違っていることがわかっているとき(デバッグモードで)知りたがっています。次に、あなたの間違った仮定に対処するか、あなたの前提に反しているかもしれない間違ったコードに対処してください(what()がNULLを返さないようにしてください)。

+1

**は言語**で使用できます(つまり、コードはコンパイルされます)が、これはC++標準によって禁止されています - Neilの答えを参照してください。 –

+0

ええ、私はあなたがNULLを返すだけでは、未定義の動作ではないかどうかはわかりません。それは何のために指定されているか違反しています。 –

0

として、多くの人は、 NULLポインタを返しますが、それかもしれないべきではない、what()を指摘しています。ヌルテストのランタイムオーバーヘッドは例外的な場合にのみ発生し、おそらくそれほど重要ではないと考えられます。

いずれにしても、少なくともassertを使用することをおすすめします。

assertのコードスペースについても問題がなければ、テスト、コードレビュー、およびその他のQAは、出荷前に違反していないすべての例外を追跡するのに十分なほどに完了します。

また、自身が投げることができる例外処理コードに注意してください(他の人が指摘しているようstd::bad_alloc例外を処理している間にstd::stringでメモリを割り当てる、例えば。)

+0

std :: bad_allocの処理中にメモリを割り当てるのは良い考えではありません。他の例外については、std :: stringを使用しないことは意味がありません。 –

関連する問題