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

Can a C++ program work well even though an exception is thrown from a class?

本文关键字:很好 工作 程序 C++ 抛出异常      更新时间:2023-10-16

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

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

我的回答:

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

类 C 没有任何实例化。

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

有什么更好的主意吗?

谢谢!

如果C的实例是类A的可选成员,则具有指向C实例的空值指针是可以的。然后,假设正确的异常处理不会有问题。

我认为它指的是这种语法:

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

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

看到这里

要成功构造一个 A 的对象,你需要成功地构造它的成员(在本例中为 BC 类型)。 如果程序正确摇摆,则意味着它可以从创建A对象的失败中恢复。

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

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

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

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

类可以通过拥有指针保存对象,并且在没有持有对象的情况下构造对象,前提是期望不会从启动器列表中转义。 例如

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
    }
}
相关文章: