如何捕获未知异常并打印出来

我有一些程序,每次我运行它,它抛出异常,我不知道如何检查它到底抛出了什么,所以我的问题是,是否有可能捕捉到异常并打印它(我发现行抛出异常)提前感谢

97820 次浏览

如果它来源于 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::stringsome_library_exception_base)。

你可以做一个包罗万象的:

try
{
}
catch (...)
{
}

但是除了这个例外,你什么也做不了。

首先试试塞缪尔 · 克拉奇科(R Samuel Klatchko)的建议。如果这没有帮助,还有其他一些方法可能会有帮助:

A)如果调试器支持,则在异常类型(已处理或未处理)上放置断点。

B)在某些系统上,编译器生成对(未记录的?)的调用当执行 throw 语句时,函数。为了找出系统的函数,编写一个简单的 hello world 程序,它会抛出并捕获一个异常。启动调试器并在异常构造函数中放置断点,然后从调用它的位置查看。调用函数可能类似于 _ _ throw ()。然后,使用要作为调试对象调试的程序重新启动调试器。在上面提到的函数(_ _ throw 或其他)上放置断点并运行程序。当引发异常时,调试器将停止运行,您可以找到原因。

如果对 gcc 或 CLANG 使用 ABI,则可以知道未知的异常类型。但它是非标准的解决方案。

看这里 Https://stackoverflow.com/a/24997351/1859469

在 C + + 11中有: 当前 _ 异常

来自网站的示例代码:

#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

答案:

#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();
}
}

灵感来自哈曼尼的回答:

#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();
}
}
}