2010-06-19 4 views
27

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

ответ

32

Если оно происходит от 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 (...) 
{ 
} 

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

+0

@R Samuel Klatchko: спасибо большое, еще один вопрос, могу ли я использовать ваш метод проверки исключений из новых и удалить? – helloWorld

+0

@helloWorld - да, это будет ловить исключения, выбитые из 'new',' delete' и любого вызванного ими конструктора или деструктора (если оператор 'new' или' delete' находится в блоке 'try'). –

+3

Как устранить проблему, если исключение не получено из std :: exception? – javapowered

1

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

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

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

11

В C++ 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 
0

Вдохновленный Dawid Дрозд ответ:

включать этот заголовок #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(); 
    } 
} 
Смежные вопросы