鉴于下面的伪代码,我想捕获类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& )
{
...
}
}
答案 0 :(得分:3)
除非在 如果不是,你根本不应该扔它。 (在这种情况下,它不是,所以是的。不要这样做。)如果他们甚至看不到它的类型,怎么会合理地捕捉到这个例外? 您可以使这项工作的方法是从成员变量的声明中拆分类的声明。有点像 但坦率地说,typedef听起来更优雅。B::A::Exception
内定义了类catch
,否则您无需在A
子句中说B
。既然您已将其编辑为 make ,那么B::A::Exception
是合适的,如果<{em> A
在B
之外可见且{ {1}}在Exception
之外可见{或者A
是制作以其他方式可用(例如通过typedef,as suggested by pmr)。< / p>
B::A::Exception
答案 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
。