【问题标题】:C++ Exception re-throwing and elipsis重新抛出省略号的 C++ 异常
【发布时间】:2013-11-21 13:54:07
【问题描述】:

让:

void foo( void )
{
    throw std::exception( "" );
}

void bar( void )
{
    try
    {
        foo():
    }
    catch( ... )
    {
        throw;
    }
}

void baz( void )
{
    try
    {
        bar();
    }
    catch( ... )
    {
    }
}

baz() 捕获了什么?一个 std::exception 还是别的什么?

感谢您的帮助!

【问题讨论】:

    标签: c++ exception try-catch throw


    【解决方案1】:

    它捕获 foo 抛出的相同 std::exception。 (至少,如果有可能像一开始那样抛出 std::exception。)throw; 没有操作数会重新抛出当前正在处理的异常对象。

    【讨论】:

    • 感谢您的帮助。
    【解决方案2】:

    是的,baz 在这种情况下会捕获 std::exception

    但是在抛出std::exception 时要小心,因为它应该用作异常的基类。 C++ 标准(第 18.8.1 段)指定 std::exception 只有一个默认构造函数和一个复制构造函数,因此您不能将消息放入其中。

    考虑改用std::runtime_error

    【讨论】:

    • 这只是示例。谢谢你的回答。
    • std::exception 在符合标准的实现中是完全可移植的。用作基类没有限制。
    • @PeteBecker, std::exception 是完全可移植的,但你不能抛出它,因为它在大多数平台上都是抽象的(MSVC 除外)。
    • 不,根据 C++ 标准,18.8.1 [异常],std::exception 不是抽象类。您可能是对的,某些实现会出错;我没看过。
    • @PeteBecker,是的,你是对的,它不是一个抽象类。但无论如何你不能 throw std::ecxeption( "message" ) 因为 C++ 标准(第 18.8.1 段)指定 std::exception 只有一个默认构造函数和一个复制构造函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2021-08-03
    • 2011-01-22
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多