Подтвердить что ты не робот

Как поймать неизвестное исключение и распечатать его

У меня есть какая-то программа, и каждый раз, когда я ее запускаю, она генерирует исключение, и я не знаю, как проверить, что именно он выбрасывает, так что мой вопрос в том, можно ли поймать исключение и распечатать его (я нашел строки, которые бросают исключение) заранее спасибо

4b9b3361

Ответ 1

Если он получен из std::exception, вы можете поймать по ссылке:

try
{
    // code that could cause exception
}
catch (const std::exception &exc)
{
    // catch anything thrown within try block that derives from std::exception
    std::cerr << exc.what();
}

Но если исключением является некоторый класс, который не получен из std::exception, вам придется заранее знать его тип (т.е. вы должны поймать std::string или some_library_exception_base).

Вы можете сделать все:

try
{
}
catch (...)
{
}

но тогда вы ничего не можете сделать с исключением.

Ответ 2

В С++ 11 у вас есть: std:: current_exception

Пример кода с сайта:

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>

void handle_eptr(std::exception_ptr eptr) // passing by value is ok
{
    try {
        if (eptr) {
            std::rethrow_exception(eptr);
        }
    } catch(const std::exception& e) {
        std::cout << "Caught exception \"" << e.what() << "\"\n";
    }
}

int main()
{
    std::exception_ptr eptr;
    try {
        std::string().at(1); // this generates an std::out_of_range
    } catch(...) {
        eptr = std::current_exception(); // capture
    }
    handle_eptr(eptr);
} // destructor for std::out_of_range called here, when the eptr is destructed

Ответ 3

Если вы используете ABI для gcc или CLANG, вы можете узнать неизвестный тип исключения. Но это нестандартное решение.

См. здесь fooobar.com/questions/205297/...

Ответ 4

Попробуйте, как предложил Р Сэмюэль Клачко. Если это не помогает, есть что-то еще, что может помочь:

a) Поместите контрольную точку в тип исключения (обработанный или необработанный), если ваш отладчик поддерживает его.

b) В некоторых системах компилятор генерирует вызов функции (недокументированной?), когда выполняется оператор throw. чтобы узнать, какая функция предназначена для вашей системы, напишите простую программу приветствия, которая бросает и ловит исключение. запустите отладчик и поместите точку останова в конструктор исключений и посмотрите, откуда он вызывается. функция caling, вероятно, похожа на __throw(). после этого снова запустите отладчик с помощью программы, которую вы хотите исследовать как debuggee. место останова на упомянутой выше функции (__throw или что-то еще) и запустить программу. когда генерируется исключение, отладчик останавливается, и вы прямо здесь, чтобы выяснить, почему.

Ответ 5

Вдохновленный ответом Давида Дрозда:

#include <exception>
try
{
    // The code that could throw
}
catch(...)
{
    auto expPtr = std::current_exception();

    try
    {
        if(expPtr) std::rethrow_exception(expPtr);
    }
    catch(const std::exception& e) //it would not work if you pass by value
    {
        std::cout << e.what();
    }
}

Ответ 6

Вдохновленный ответом hamaney:

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>

int main()
{
   try
   { 
      // Your code
   }
   catch (...)
   {
      try
      {
         std::exception_ptr curr_excp;
         if (curr_excp = std::current_exception())
         {
            std::rethrow_exception(curr_excp);
         }
      }
      catch (const std::exception& e)
      {
         std::cout << e.what();
      }
   }
}