У меня есть программа, и каждый раз, когда я запускаю ее, она генерирует исключение, и я не знаю, как проверить, что именно это выбрасывает, так что мой вопрос в том, можно ли исключить исключение и распечатать его (я нашел строки, которые бросает исключение) заранее спасибоКак поймать неизвестное исключение и распечатать его
ответ
Если оно происходит от 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 (...)
{
}
, но тогда вы не можете ничего за исключением делать.
Попробуйте, как предложил Р. Сэмюэль Клачко. Если это не помогает, есть что-то еще, что может помочь:
a) Поместите контрольную точку на тип исключения (обработанный или необработанный), если ваш отладчик поддерживает его.
b) В некоторых системах компилятор генерирует вызов функции (недокументированной?) При выполнении инструкции throw. чтобы узнать, какая функция предназначена для вашей системы, напишите простую программу приветствия, которая бросает и ловит исключение. запустите отладчик и поместите точку останова в конструктор исключений и посмотрите, откуда он вызывается. функция caling, вероятно, похожа на __throw(). после этого снова запустите отладчик с помощью программы, которую вы хотите исследовать как debuggee. место останова на упомянутой выше функции (__throw или что-то еще) и запустить программу. когда генерируется исключение, отладчик останавливается, и вы прямо здесь, чтобы выяснить, почему.
Если вы используете ABI для gcc или CLANG, вы можете узнать неизвестный тип исключения. Но это нестандартное решение.
Смотрите здесь https://stackoverflow.com/a/24997351/1859469
В 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
Вдохновленный 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();
}
}
- 1. Не удалось поймать неизвестное исключение
- 2. Поймать неизвестное исключение хоста в модульном тесте
- 3. Поймать определенную переменную и распечатать его значение
- 4. Как сбросить исключение снова и поймать его
- 5. Как поймать исключение и показать его данные
- 6. Неизвестное исключение и авария
- 7. как поймать исключение devenv
- 8. Android Java JSON Неизвестное исключение
- 9. Как поймать ошибку и распечатать пользователю
- 10. jmeter и неизвестное исключение хоста
- 11. OCaml - как поймать исключение
- 12. base.OnCreate (bundle); Неизвестное исключение
- 13. Как поймать исключение «FileNotFoundException»?
- 14. Пытается поймать ошибку FormatException. Только Исключение может его поймать?
- 15. Как поймать исключение из иностранного класса
- 16. Неизвестное исключение во время построения
- 17. Как распечатать исключение, используя журнал?
- 18. BufferedWriter - неизвестное исключение источника
- 19. Как поймать исключение конструктора?
- 20. C# как поймать Исключение
- 21. Как поймать исключение?
- 22. Как поймать исключение FeignClient
- 23. Как поймать арифметическое исключение
- 24. Как поймать исключение CheckInvalidPathChars()
- 25. Как поймать внутреннее исключение
- 26. Как поймать внешнее исключение
- 27. Исключение поймать исключение
- 28. Попытайтесь поймать, всегда поймать исключение
- 29. C++ как поймать исключение?
- 30. Как поймать исключение NoSuchElementException?
@R Samuel Klatchko: спасибо большое, еще один вопрос, могу ли я использовать ваш метод проверки исключений из новых и удалить? – helloWorld
@helloWorld - да, это будет ловить исключения, выбитые из 'new',' delete' и любого вызванного ими конструктора или деструктора (если оператор 'new' или' delete' находится в блоке 'try'). –
Как устранить проблему, если исключение не получено из std :: exception? – javapowered