如何在初始化列表中捕获异常?

sky*_*oor 7 c++ initialization-list

我有一个关于如何在初始化列表中捕获异常的问题.

例如,我们有一个派生自Bar的Foo类

class Foo {

public:
Foo(int i) {throw 0; }

}

class Bar : public Foo{

public:

Bar() : Foo(1) {}

}
Run Code Online (Sandbox Code Playgroud)

小智 10

我觉得语法是像这样(即使它是还好赶上这样的事情在主叫方.而且你会怎样做,一旦你抓住了吗?)

Bar::Bar()
try
  : Foo(1)
{
}
catch( const SomeException &e )
{
}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这是一些奇怪的代码. (5认同)
  • 请注意,这不能用于忽略该异常.如果`catch`块没有自己抛出异常,则会自动重新抛出原始异常(有关详细信息,请参阅链接的GOTW). (3认同)
  • @Potatoswatter,不,它不能.就我所知,你甚至不能在一个ctor-initializer的`catch`块的体内`return;`(与其他函数try块的catch块相对). (3认同)

Tod*_*ner 6

C++有一个这样做的机制,但它很少使用.它是函数try块:

Bar::Bar()
try
  : Foo(1)
{
}
catch( Something )
{
}
Run Code Online (Sandbox Code Playgroud)

请参阅此经典文章,其中概述了为什么它只应用于转换异常(例如,异常类型FooException变为BarException).