如何从私有成员子类对象中捕获异常?

时间:2012-04-22 21:35:30

标签: c++

鉴于下面的伪代码,我想捕获类B中子对象a抛出的异常,在B中保持此对象为私有。如下所述的catch子句不起作用,因为对象a是私有的在B.我怎么能抓住这个例外?

编辑我已将伪代码更改为在B类中嵌入A类。

class B
{
    class A
    {
        public:
        class Exception{};
        A() throw(Exception) { ... }  // A ctor throws an Exception class object
    } a;
    public:
    B() { ... }     //  B ctor
};

int main()
{
    try
    {
        B b;
    }
    catch( B::A::Exception& )
    {
        ...
    }

}

4 个答案:

答案 0 :(得分:3)

除非在B::A::Exception内定义了类catch,否则您无需在A子句中说B。既然您已将其编辑为 make ,那么B::A::Exception是合适的,如果<{em> AB之外可见且{ {1}}在Exception之外可见{或者A制作以其他方式可用(例如通过typedef,as suggested by pmr)。< / p>

如果不是,你根本不应该扔它。 (在这种情况下,它不是,所以是的。不要这样做。)如果他们甚至看不到它的类型,怎么会合理地捕捉到这个例外?

您可以使这项工作的方法是从成员变量的声明中拆分类的声明。有点像

B::A::Exception

但坦率地说,typedef听起来更优雅。

答案 1 :(得分:1)

在周围的类中为异常添加一个typedef。

class B
{
    class A
    {
        public:
        class Exception{};
        A() throw(Exception) {  }  // A ctor throws an Exception class object
    } a;

public:
  typedef A::Exception Except;
    B() {  }     //  B ctor
};

int main()
{
    try
    {
        B b;
    }
    catch( B::Except& )
    {

    }

}

答案 2 :(得分:1)

您可能想重新考虑在构造函数中抛出异常。 Here's why(抛出异常时不会调用析构函数)

例外情况确实适用于特殊情况。不要过度使用它们。

答案 3 :(得分:0)

由于A是私有的,因此您无法访问类型Exception来捕获它。有一些解决方案,首先是抓住任何东西:

try {
    B b;
} catch(...) {
}

其次是创建一个在main中可见的独立Exception类。

最后,您可以B::A::Exception延长std::Exception并抓住std::Exception