У меня есть какая-то программа, и каждый раз, когда я ее запускаю, она генерирует исключение, и я не знаю, как проверить, что именно он выбрасывает, так что мой вопрос в том, можно ли поймать исключение и распечатать его (я нашел строки, которые бросают исключение) заранее спасибо
Как поймать неизвестное исключение и распечатать его
Ответ 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();
}
}
}