2017-01-19 10 views
10

私はC++を勉強しています。私自身の例外を作成してLinuxに投げ込もうとしています。C++でカスタム例外を作成する

実装をテストするための小さなテストプロジェクトを作成しましたが、以下は例外クラスのヘッダーファイルです。

class TestClass : public std::runtime_error 
{ 
public: 
    TestClass(char const* const message) throw(); 
    virtual char const* what() const throw(); 
}; 

例外クラスのソースファイルが私のメインアプリで

using namespace std; 

TestClass::TestClass(char const* const message) throw() 
    : std::runtime_error(message) 
{ 

} 

char const * TestClass::what() const throw() 
{ 
    return exception::what(); 
} 

で、私は例外をスローし、次のようにのtry/catchでそれをキャッチする関数を呼び出しています:

void runAFunctionAndthrow(); 

/* 
* 
*/ 
int main(int argc, char** argv) { 
    try 
    { 
     cout << "About to call function" << endl; 
     runAFunctionAndthrow(); 
    } 
    catch (TestClass ex) 
    { 
     cout << "Exception Caught: " << ex.what() << endl; 
    } 

    return 0; 
} 

void runAFunctionAndthrow() 
{ 
    cout << "going to run now. oh dear I need to throw an exception" << endl; 

    stringstream logstream; 
    logstream << "This is my exception error. :("; 
    throw TestClass(logstream.str().c_str()); 
} 

私は次のような出力を得るために期待してい実行します。

About to call function

Going to run now. oh dear I need to throw an exception

Exception Caught: This is my exception error. :(

を私が取得しています何の代わりに10

ではなく、私の実際の例外メッセージのSTD ::例外は、「これは私の例外エラーです」と言い、最後の行

About to call function

going to run now. oh dear I need to throw an exception

Exception Caught: std::exception

お知らせです。

これはなぜですか、Windowsでは問題なく動作しますが、Linuxではこれが行われます。

さまざまな投稿で見たことから、私が行ったことは正しいので、何が欠けているのでしょうか。

+0

'what()'では、おそらく 'return runtime_error :: what();'を意味しています - 再実装を完全に省略することになります(ここでの基本クラスの振る舞いは既にあなたには良いことです)。 –

答えて

17

あなたwhat()リターン:std::exception::what()から

return exception::what(); 

戻り値はspecified as followsです:

Pointer to a null-terminated string with explanatory information.

それだこと。それ以上は何もない。あなたが確かに示しているテキストは、「説明的な情報」としての資格があります。そして、これは復帰値what()のための唯一の要件です(他の1つを除いてここでは密接な関係にありません)。

つまり、C++は、what()で取得したものの正確な内容を保証しません。 what()あなたが見ると、what()が得られます。

例外を自分自身で記述したい場合は、何らかの形でそれを実装するかどうかは、what()の一部です。

+1

'TestClass'は' std :: runtime_error'を継承しているので、 'what()'を再実装するのを避けることができます - 'std :: runtime_error :: what()'は既にコンストラクタに渡されたメッセージを返します。 –

+0

@MatteoItalia私はちょうどそれに気付き、あなたの説明からあなたのコメントの前に試してみました、そして、私は今、何を期待していましたか。あなたの助けをありがとう – Boardy

0

afdが許可されていないstd :: exceptionにカスタムエラーメッセージを指定する方法が必要です。考えられる解決策はthisを参照してください。

8

あなたは何を()メソッドの独自の実装を必要としたり、コメント

で書かれたようstd::runtime_error::what()を使用セイ:

class TestClass : public std::runtime_error 
{ 
    std::string what_message; 
public: 
    const char* what() override 
    { 
     return what_message.c_str(); 
    } 
}; 

はまた、より良いあなたがそれらについて読むだけで後noexceptの代わりthrow()を使用 - link

そして、あなたのtry-catchで:

catch (const TestClass& myException) 

代わりのcatch(TestClass myException) - そうでなければ、潜在的に例外スローになることが暗黙のコピーを行います。それはまた、多形性を破る:catchpure virtual interface実装インスタンスにしたい場合は、参照を使用する必要があります。

+0

ああ、ありがとう、おかげで余分な情報を知っている。 – Boardy

関連する問題