【问题标题】:How to catch the exception in initialization list? [duplicate]如何在初始化列表中捕获异常? [复制]
【发布时间】:2010-03-14 12:44:41
【问题描述】:

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

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

class Foo {

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

}

class Bar : public Foo{

public:

Bar() : Foo(1) {}

}

【问题讨论】:

    标签: c++ initialization-list


    【解决方案1】:

    我认为语法类似于this(尽管在调用者中捕获这样的东西会更好。一旦捕获它你会做什么?)

    Bar::Bar()
    try
      : Foo(1)
    {
    }
    catch( const SomeException &e )
    {
    }
    

    【讨论】:

    • 哇,这是一些看起来很奇怪的代码。
    • 请注意,这不能用于忽略异常。如果catch 块没有自己抛出异常,则会自动重新抛出原始异常(有关详细信息,请参阅链接的 GOTW)。
    • @sth: 当然可以,就return
    • @Potatoswatter,不,它不能。据我所知,你甚至不能在这样的 catch 块的主体中​​使用 return;(与其他函数 try 块的 catch 块相反)。
    • @Johannes:嘿,你是对的,§15.3/15。此外,您不能尝试执行初始化:“在处理程序中为该对象的构造函数或析构函数的函数尝试块引用对象的任何非静态成员或基类会导致未定义的行为。”这有点糟糕!
    【解决方案2】:

    C++ 有这样做的机制,但很少使用。就是函数try块:

    Bar::Bar()
    try
      : Foo(1)
    {
    }
    catch( Something )
    {
    }
    

    参见这个经典的gotw,它概述了为什么它应该只用于翻译异常(例如,异常类型 FooException 变为 BarException)。

    【讨论】:

      【解决方案3】:

      我相信这应该被创建对象的过程捕获。

      【讨论】:

        【解决方案4】:

        考虑用boost::optional 替换麻烦的实例。然后你可以将它的初始化推迟到构造函数的主体中。

        【讨论】:

          猜你喜欢
          • 2010-09-14
          • 1970-01-01
          • 2013-04-15
          • 2014-07-27
          • 2020-10-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多