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();
}
#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条答案
按热度按时间3z6pesqy1#
如果它派生自
std::exception
,则可以通过引用捕获:但如果异常是某个不是从
std::exception
派生的类,则必须提前知道它的类型(即,应该捕获std::string
还是some_library_exception_base
)。你可以做一个捕获所有:
但你不能对异常做任何事。
5f0d552i2#
在C++11中您可以:std::current_exception
研究中心的示例代码:
a5g8bdjr3#
如果你使用ABI来处理gcc或者CLANG,你可以知道未知的异常类型,但是这不是标准的解决方案。
请参见此处https://stackoverflow.com/a/24997351/1859469
njthzxwz4#
先试试R Samuel Klatchko的建议。如果这没有帮助,还有其他方法可能会有帮助:
a)如果您的调试器支持,则在异常类型(已处理或未处理)上放置断点。
B)在某些系统上,编译器生成对(undocumented?)函数当一个throw语句被执行.要找出,什么函数那是为你的系统,写一个简单的hello world程序,那throw和catch一个异常.启动一个调试器并且放置一个断点在这异常构造函数,并查看从何处调用它。缩放函数可能类似于__throw().之后,再次启动调试器并将程序作为被调试程序进行调查.在上面提到的函数上放置断点(__throw或其他什么)并运行程序。当异常被抛出时,调试器停止,你就在那里找出原因。
biswetbf5#
灵感来自达维德·德罗兹德的回答:
8wigbo566#
灵感来自哈曼尼的回答: