1

给定下面的伪代码,我想捕获 B 类中的子对象 a 抛出的异常,并在 B 中维护该对象私有。如下所述的 catch 子句不起作用,因为对象 a 在 B 中是私有的。我怎样才能捕捉到这个异常?

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

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

4 回答 4

3

你不需要B::A::Exceptioncatch子句中说,除非类A是在里面定义的B。既然您已经对其进行了编辑以使其如此,B::A::Exception那么如果 A在外部可见B并且Exception在外部可见A......或者如果B::A::Exception以其他方式可用(如通过 typedef,pmr 所建议的那样)是合适的。

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

您可以使这项工作的一种方法是将类的声明与成员变量的声明分开。有点像

class B {
 public:
    B() { }

    class A {
     public:
        class Exception {};
        A() { /* throw Exception(); */ }
    };
 private:
    A a;
};

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

于 2012-04-22T21:38:25.387 回答
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& )
    {

    }

}
于 2012-04-22T21:38:55.807 回答
1

您可能需要重新考虑在构造函数中抛出异常。这就是原因(抛出异常时不会调用析构函数)

例外确实是针对特殊情况的。不要过度使用它们。

于 2012-04-22T22:14:46.617 回答
0

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

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

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

最后,您可以进行B::A::Exceptionextendstd::Exception和 catch std::Exception

于 2012-04-22T21:55:16.577 回答