Исключение cpp получить информацию о броске вызывающего - PullRequest
0 голосов
/ 25 мая 2018

У меня есть какое-то пользовательское исключение, как показано ниже

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 ]

0 голосов
/ 25 мая 2018

это должно быть полезно:

Как автоматически генерировать трассировку стека при сбое моей программы gcc C ++

вы можете найти способ печати стека вызовов и распечататьв обработчике исключений.

0 голосов
/ 25 мая 2018

Нет простых портативных способов сделать это в C++, о которых я знаю.Есть несколько достаточно сложных способов получить полную трассировку стека с помощью вызовов, специфичных для операционной системы.

Самый простой способ, которым я использую для получения источника исключения, - это использование MACROS.

Макросы не рекомендуются там, гдеих можно избежать, но это одно из немногих мест, где они оказываются полезными.

Я склонен использовать что-то немного более сложное, чем это, но это его основы:

#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 не установлен, потому что release builds должен установить этот макрос для отключения отладочной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...