异常可以自动提供有关其环境的详细信息

时间:2013-11-18 08:57:08

标签: c++ exception

我想做什么:

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"

这可能吗?

2 个答案:

答案 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这样的库在运行时生成它们。生成跟踪的成本非常高,但由于您只是在发生异常时才这样做,所以应该没问题。