【发布时间】:2010-03-14 12:44:41
【问题描述】:
我有一个关于如何在初始化列表中捕获异常的问题。
例如,我们有一个派生自 Bar 的类 Foo
class Foo {
public:
Foo(int i) {throw 0; }
}
class Bar : public Foo{
public:
Bar() : Foo(1) {}
}
【问题讨论】:
我有一个关于如何在初始化列表中捕获异常的问题。
例如,我们有一个派生自 Bar 的类 Foo
class Foo {
public:
Foo(int i) {throw 0; }
}
class Bar : public Foo{
public:
Bar() : Foo(1) {}
}
【问题讨论】:
我认为语法类似于this(尽管在调用者中捕获这样的东西会更好。一旦捕获它你会做什么?)
Bar::Bar()
try
: Foo(1)
{
}
catch( const SomeException &e )
{
}
【讨论】:
catch 块没有自己抛出异常,则会自动重新抛出原始异常(有关详细信息,请参阅链接的 GOTW)。
return。
catch 块的主体中使用 return;(与其他函数 try 块的 catch 块相反)。
C++ 有这样做的机制,但很少使用。就是函数try块:
Bar::Bar()
try
: Foo(1)
{
}
catch( Something )
{
}
参见这个经典的gotw,它概述了为什么它应该只用于翻译异常(例如,异常类型 FooException 变为 BarException)。
【讨论】:
我相信这应该被创建对象的过程捕获。
【讨论】:
考虑用boost::optional 替换麻烦的实例。然后你可以将它的初始化推迟到构造函数的主体中。
【讨论】: