【发布时间】:2018-11-04 17:53:15
【问题描述】:
我有一些自定义异常,如下所示
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;
}
所以在主函数中我无法知道 throw 的调用者(哪个函数抛出了异常),如何获取该详细信息?
【问题讨论】:
-
为什么不为异常写一个有意义的消息,其中包括抛出函数的名称?在 C++11 中,您可以使用
__func__获取当前函数的名称。 -
出于调试目的,您可以设置断点并查看调用堆栈。如果你也想在发布中,也许像这里cplusplus.com/reference/exception/rethrow_exception 一样重新抛出异常。根据您的编译器,您还可以使用 _FUNCTION_ 或 _FILE_ 和 _LINE_ 来抛出
return -
在 C++11 及更高版本中,有一个预定义的宏
__func__可用于获取函数的名称,在该函数中它被称为以 nul 结尾的字符串(但不是字符串文字),并且可以传递给异常的构造函数并存储一个副本。对于 C++11 之前的编译器的任何答案(如果有的话)都将是特定于编译器的,因此您需要指定您的编译器。