2013-11-21 30 views
2

让:C++异常重新投掷和省略号

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

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

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

是什么巴兹()赶上?一个std ::异常或其他东西?

感谢您的帮助!

回答

3

它捕获foo引发的std::exception。 (至少,如果有可能首先抛出std::exceptionthrow;没有操作数会重新抛出当前正在处理的异常对象。

+0

感谢您的帮助。 – Virus721

1

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

但投掷std::exception时要小心,因为它应该用作例外的基类。 C++标准(第18.8.1节)指定std::exception只有一个默认的构造函数和一个拷贝构造函数,所以你不能把消息放进去。

请考虑使用std::runtime_error代替。

+0

这只是为了举例。感谢您的回答。 – Virus721

+0

std :: exception'在符合标准的实现中是完全可移植的。作为基类没有限制。 –

+0

@PeteBecker,'std :: exception'是完全可移植的,但是由于它在大多数平台上是抽象的(不包括MSVC),所以不能抛出它。 –