2016-10-31 11 views
1

したがって、私はtry/catchブロックのためにC++ referenceを見ています。C++キャッチ(...)ブロックからエラーメッセージを取得するには?

私はそうのような例外を捕捉するために、いくつかの方法がある参照

try { 
    f(); 
} catch (const std::overflow_error& e) { 
    // this executes if f() throws std::overflow_error (same type rule) 
} catch (const std::runtime_error& e) { 
    // this executes if f() throws std::underflow_error (base class rule) 
} catch (const std::exception& e) { 
    // this executes if f() throws std::logic_error (base class rule) 
} catch (...) { 
    // this executes if f() throws std::string or int or any other unrelated type 
} 

私はあなたがそうのような「e」のデータを取り込むことができ、以下の例で参照してください。

std::cout << e.what(); 

だから私の質問は次の通りです:

catch(...)で例外データを取得するにはどうすればよいですか?

(サイド質問:?それも賢明catch(...)を使用することです)一般的に

+3

できません。 '...'をつかまえているなら、これは整数からstd :: stringまでの何でもかまいません。あなたが通常 '...'で行うべき唯一のことは、いくつかのロギングシステムでは未知の例外を記録し、再スローする(アプリケーションが終了するようにする)ことです。そして、あなたのコードをデバッグして、なぜ奇妙なものが投げられたのかを理解してください。 –

+0

@LokiAstariさて、まあそれは意味をなさない。ありがとう:) – CodeLikeBeaker

答えて

7

、あなたがすることはできません。 C++は何かがスローされることを可能にします。例えば、throw 42;は完全に明確なC++コードであり、例外の型はintです。例外がスローされ

  • 場合は、すべての道までは、std::terminateが呼び出され、それにはcatchブロックが存在しないとの保証はありません - それはそれを使用するのが賢明であることについては

    有効な用途がありますスタック巻き戻しcatch(...)はそれを保証します(例外をキャッチするため)。

    int main() 
    try { 
        super_important_resource r; 
        may_throw(); 
        // r's destructor is guaranteed to execute during stack unwinding 
    } catch(...) { 
    } 
    
    • それを再スローする前に、例外がスローされたことをログに記録する有効なユースケースです

      int main() 
      { 
          super_important_resource r; 
          may_throw(); 
          // r's destructor is *not* guaranteed to execute if an exception is thrown 
      } 
      

try { 
//... 
} catch(...) { 
    log() << "Unknown exception!"; 
    throw; 
} 
+0

あなたの答えはkrzaqありがとうございます。意味あり。 – CodeLikeBeaker

+0

私は、キャプチャされていない例外を持つスタックの巻き戻しに関する問題は、main()関数のスタックに割り当てられたリソースだけで発生する可能性があると考えていますか? 例外ポイントから上に移動している間、少なくともmain()関数までスタックを巻き戻さなければなりませんか? – Arkady

1

どのように私はcatch(...)上の例外データを得るのですか?

一般的に、任意の例外を取得することはできません。それでも、例外タイプが既知のタイプの1つであれば、現在の例外を再スローしてキャッチすることができます。

サイドの質問:?それはcatch(...)を使用するのも、賢明である)

これは、予期しない例外を処理するために、フォールバックオプションとしてで使用することは理にかなって。また、キャッチシリーズのコピー貼り付けを避けるためにキャッチリスローの手法を検討することもできます。

void Catcher() 
{ 
    try 
    { 
     throw; 
    } 
    catch (const std::overflow_error& e) { 
     // this executes if f() throws std::overflow_error (same type rule) 
    } 
    catch (const std::runtime_error& e) { 
     // this executes if f() throws std::underflow_error (base class rule) 
    } 
    catch (const std::exception& e) { 
     // this executes if f() throws std::logic_error (base class rule) 
    } 
    catch (...) { 
     // oops! 
    } 
} 

int main() 
{ 
    try { 
     f(); 
    } 
    catch (...) { 
     Catcher(); 
    } 
} 
+0

これはOPの質問にどのように対処していますか? – erenon

+0

@erenonもし 'catch(...)'ブロック内にいれば、既知の型の例外を引き続き得ることができます。 – AlexD

+2

なぜdownvote BTW? – AlexD

関連する問題