我想做什么:
struct A
{
void f()
{
throw auto_exception("something went wrong");
}
}
class Foo
{
void bar()
{
throw auto_exception("step 2 failed");
}
}
异常的what()
字符串应分别读取:
"Exception in A::f(). something went wrong"
"Exception in Foo::bar(). step 2 failed"
这可能吗?
答案 0 :(得分:6)
假设您的C ++编译器支持__FUNCTION__
(或C ++ 11中的__func__
),您可以将AUTO_EXCEPTION定义为:
#define AUTO_EXCEPTION( msg ) std::runtime_error( std::string(__FUNCTION__) + ": " + msg )
答案 1 :(得分:5)
我不会真正称之为“环境信息”。您可能可以将其与__FILE__
和__LINE__
宏以及__func__
(或者可能是__PRETTY_FUNCTION__
一起放在GCC中,或者查看编译器手册以了解其他合适的内容。扩展)。
可能更有趣的是动态环境,例如引发异常的点的执行跟踪。您可以使用像libunwind这样的库在运行时生成它们。生成跟踪的成本非常高,但由于您只是在发生异常时才这样做,所以应该没问题。