2

このglewInit()の呼び出しは失敗し(レコードの場合、どちらにも答えがありませんが....)、例外がスローされます。

残念ながら、それは私のキャッチのいずれにも捕らえられていません。

私は何が間違っているのですか?

try {

   // Initialize GLEW
    if (glewInit() != GLEW_OK)
        throw std::exception("Failed to initialize GLEW\n");


} catch ( std::system_error const& err) {
    fprintf(stdout, "System Error: %s", err.what());
    glfwTerminate(); // Free glfw if it has been allocated
    // Try Again
    this->InitWithSize(_width, _height);
} catch( std::exception const& err) {
    fprintf(stdout, "Exception Found: %s", err.what());
} catch ( ... ) {
    fprintf(stdout,"Unknown Exception Occured\n");
}
4

2 に答える 2

5

「私は何が間違っているのですか?」

さて、申し立てられた例外が表示されないことに関して、私は仮説を立てません。

しかし、ここにあなたが間違っているいくつかのことがあります:

  • std::exception文字列をコンストラクターに渡します。これは非標準の拡張機能です。std::exception文字列引数を取るコンストラクターはありません。例外テキストを渡す場合は、を使用しますstd::runtime_error

  • スローの可能性の後に通常のステートメントがないということは、例外がスローされたことを確認できないことを意味します。

  • 例外メッセージに改行が含まれています。非常に問題のある慣習。他のソースからの例外には、その最後の改行はありません。

  • のエラーの報告stdout。これに使用stderrします。それが目的です。

  • catch句内のリソースを解放します。一般的に、野生の騒乱を引き起こします。そのためにデストラクタを使用しないでください。

于 2012-12-09T03:14:48.830 に答える
1

捕まえられていないことをどうやって知るのですか?

私はそれが実際にcatch( std::exception const& err)節によって捕らえられていると思います。ただし、印刷された文字列の最後に追加するのを忘れた\nため、行バッファ出力デバイスにすぐには表示されません。fprintfコード内の他のすべてのはそれを持っていますが\n、この特定のものは持っていません。

\nまたは出力をに追加しstderrます。

あなたはおそらくこれfprintfが最終的に次のように見えることを意図していました

fprintf(stdout, "Exception Found: %s", err.what());

つまり\n、例外テキストの内部が終了として機能する必要があります\n。もしそうなら、このようにしてください。ただし、現在持っているものはすぐには画面に表示されないため、例外がキャッチされなかったと思われます。

于 2012-12-09T02:46:10.857 に答える