即使从类中抛出异常,C ++程序也能正常工作吗?

时间:2012-05-27 15:14:43

标签: c++ class exception exception-handling constructor

这是一个面试问题,面试已经完成。

鉴于A级成员为B级和C级成员。 如果在C类的构造函数中发生异常但程序仍然可以正常工作,那么原因是什么?

我的回答:

C类的构造函数不是由A实现的。或者,A没有一些指令来对C类执行某些操作。

C类没有任何实例化。

异常不是错误。异常处理函数处理得很好。

有更好的想法吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

如果C的实例是类A的可选成员,那么具有指向C实例的空值指针就可以了。然后,假设适当的异常处理就没有问题。

答案 1 :(得分:1)

要成功构建A的对象,您需要成功构建其成员(在本例中为BC类型)。如果程序正确运行,则意味着它可以从创建A对象失败中恢复。

程序必须捕获从A的构造函数抛出的异常并以某种方式处理错误情况。

例如,您可以将一组不同的参数传递给A的构造函数(后者又将不同的参数传递给其C成员ctor,现在它不会抛出),例如基于替代配置值。

或者有一个替代路径来解决原始问题而不涉及创建类型A的对象(例如,这个替代路径的计算成本可能更高,这可能是因为它不是第一选择)。

答案 2 :(得分:1)

我认为这是指这种语法:

 A::A() try : B(...),C(...) 
 {
    //A constructor body
 }
 catch(...) {}

编辑没关系,每个未在catch块中显式重新抛出的异常都会自动重新抛出

请参阅this

答案 3 :(得分:0)

如果设计的话,程序可以继续工作,但是类型A的对象的构造必须失败,因为如果对象的任何基础或成员初始化失败,则不可能完全构造对象。 / p>

一个类可以通过拥有指针来保存一个对象,并且可以在没有保持对象的情况下构造它,前提是它不会从initailizer列表中逃脱。 E.g。

struct C {
    C();
};

struct A {
    A();
    std::unique_ptr<C> c;
};

A::A() {
    try {
        c.reset(new C);
    }
    catch (...){
        // oops. Can't re-throw, could log
    }
}