bugfix> c++ > 投稿

以下のようなカスタム例外があります

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
} myex;
void testException(){
 throw myex;
}
void doSomething2(){
   testException();
}
void doSomething1(){
   doSomething2();
}

int main () {
  try
  {
    doSomething1();
  }
  catch (exception& e)
  {
    cout << e.what() << '\n';
  }
  return 0;
}

だからメイン関数では、スローの呼び出し元(どの関数が例外をスローしたか)を知ることができません、その詳細を取得する方法は?

回答 2 件
  • 簡単なことはありませんポータブル  C++ でこれを行う方法  私が知っていること。オペレーティングシステム固有の呼び出しを使用して完全なスタックトレースを取得するには、かなり複雑な方法がいくつかあります。

    例外のソースを取得するために使用する最も簡単な方法は、マクロを使用することです。

    回避できるマクロはお勧めしませんが、これは有用であることが証明されている数少ない場所の1つです。

    私はこれより少し複雑なものを使用する傾向がありますが、これが基本です:

    #ifndef NDBUG
    #define throw_runtime_error(msg) \
        throw std::runtime_error(std::string(msg) \
            + " line: " + std::to_string(__LINE__) \
            + " file: " + std::string(__FILE__))
    #else
    #define throw_runtime_error(msg) throw std::runtime_error(msg)
    #endif
    void doSomething2(){
        throw_runtime_error("My runtime error.");
    }
    void doSomething1(){
       doSomething2();
    }
    int main()
    {
        try
        {
            doSomething1();
        }
        catch(std::exception const& e)
        {
            std::cerr << e.what() << '\n';
            return EXIT_FAILURE;
        }
        return EXIT_SUCCESS;
    }
    
    

    完全なトレースは取得できませんが、例外がスローされた場所を確認できます。 MACROには、 NDBUG の場合にのみデバッグ情報が含まれます。  設定されていません解放する ビルドは、デバッグ情報を無効にするためにそのマクロを設定する必要があります。

  • これは役立つはずです:

    gcc C ++プログラムがクラッシュしたときにスタックトレースを自動的に生成する方法

    呼び出しスタックを印刷し、例外ハンドラーで印刷する方法を見つけることができます。

あなたの答え
関連した質問