即使从类中抛出异常,C++程序也能很好地工作吗?
Can a C++ program work well even though an exception is thrown from a class?
这是一个面试问题,面试已经完成。
给定一个 A 类,成员为 B 类和 C 类。如果在类 C 的构造函数中发生异常,但程序仍然可以正常工作,原因是什么?
我的回答:
类 C 的构造函数不是由 A 实现的。或者,A 没有在类 C 上执行某些操作的一些指令。
类 C 没有任何实例化。
异常不是错误。异常处理程序函数处理得很好。
有什么更好的主意吗?
谢谢!
如果C
的实例是类A
的可选成员,则具有指向C
实例的空值指针是可以的。然后,假设正确的异常处理不会有问题。
我认为它指的是这种语法:
A::A() try : B(...),C(...)
{
//A constructor body
}
catch(...) {}
编辑没关系,每个未在 catch 块中显式重新抛出的异常都会自动重新抛出
看到这里
要成功构造一个 A
的对象,你需要成功地构造它的成员(在本例中为 B
和 C
类型)。 如果程序正确摇摆,则意味着它可以从创建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
}
}
相关文章:
- 有没有办法关闭文件? fclose 不能很好地工作
- 当我使用长整型时,我的代码不起作用,它与 int 一起工作得很好
- 人生游戏中的随机播种不能很好地工作
- Qt - 拖动移动 q图形项不能很好地工作
- 为什么我的.exe文件崩溃了,但在调试和发布版本中工作得很好
- C++选项定价函数..单独工作很好,但对于股票价格的范围(向量)来说不行
- C++,如果其他新文件出现问题,使用g++进行编译可以很好地工作
- 即使从类中抛出异常,C++程序也能很好地工作吗?
- std::ref 和交换功能似乎不能很好地协同工作
- 神经网络似乎工作得很好,直到用于处理数据(所有的结果几乎是相同的)
- 为什么decltype返回类型在递归模板中失败,而返回类型演绎却工作得很好?
- md5的实现在字符串上工作得很好,但是在文件上不能给出正确的结果
- 自定义分配器- Microsoft std::map实现对相同的元素进行两次重新分配,GCC工作得很好
- 为什么我在Codechef的褪色回文中得到一个WA,即使我在我的代码中没有发现任何错误,它对我来说工作得很好
- 不能在一个项目中将argv传递给字符串;在另一个地方工作得很好
- 没有安装VS2012, c / c++ dll缺少依赖项.有了它,它工作得很好
- wxWidget应用程序没有错误,但在Eclipse中可以很好地工作
- Excel 64位中的C函数不作为工作表函数,但在VBA中工作得很好
- 以基于迭代器的方式学习C++:这对获得背景很好,但对获得工作实用吗
- 用于HBITMP的函数DestroyObject不能很好地工作(内存泄漏)