CPP 异常获取抛出调用方的详细信息

cpp exception get the details of throw caller

本文关键字:详细信息 调用 异常 获取 CPP      更新时间:2023-10-16

>我有一些自定义异常,如下所示

class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex;
void testException(){
throw myex;
}
void doSomething2(){
testException();
}
void doSomething1(){
doSomething2();
}

int main () {
try
{
doSomething1();
}
catch (exception& e)
{
cout << e.what() << 'n';
}
return 0;
}

所以在主函数中我无法知道抛出的调用者(哪个函数抛出了异常(,如何获取该详细信息?

据我所知,没有简单的便携式方法可以在C++中做到这一点。有一些相当复杂的方法可以使用特定于操作系统的调用来获取完整堆栈跟踪。

我用来获取异常源的最简单方法是使用 MACROS。

在可以避免的地方不建议使用宏,但这是它们被证明有用的少数地方之一。

我倾向于使用比这稍微复杂一些的东西,但这是它的基础:

#ifndef NDBUG
#define throw_runtime_error(msg) 
throw std::runtime_error(std::string(msg) 
+ " line: " + std::to_string(__LINE__) 
+ " file: " + std::string(__FILE__))
#else
#define throw_runtime_error(msg) throw std::runtime_error(msg)
#endif
void doSomething2(){
throw_runtime_error("My runtime error.");
}
void doSomething1(){
doSomething2();
}
int main()
{
try
{
doSomething1();
}
catch(std::exception const& e)
{
std::cerr << e.what() << 'n';
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

您不会获得完整的跟踪,但确实可以看到引发异常的位置。仅当未设置NDBUG时,宏才包含调试信息,因为发布版本应将该宏设置为禁用调试信息。

这应该会有所帮助:

如何在 gcc C++ 程序崩溃时自动生成堆栈跟踪

您可以找到打印调用堆栈的方法,并在异常处理程序中打印它。