【发布时间】:2015-10-23 11:10:50
【问题描述】:
如果在构建对象时需要获取的资源可能会失败,如果本地编码标准禁止异常,是否可以执行 RAII?
如果是,那么在这种情况下处理资源获取失败的规范方式是什么?
【问题讨论】:
-
当我因为某种原因不能使用异常时,我最终会为可能无法构造的对象创建初始化方法。所以构造函数除了简单的设置外不会做任何事情。然后我可以有一个 Init 方法来执行实际的资源获取并相应地返回 true/false。
-
你的指导方针没有提到类似的情况吗?毕竟它是一个非常常见的C++习语。如果指南允许,您始终可以使用类似于standard I/O library 及其流的系统,例如流可以在条件中用于检查错误,或者类似于具有
is_open函数的文件流。 -
@JoachimPileborg 我认为指南中没有考虑到它,它们很可能需要更新(尽管它是嵌入式实时系统,并且不喜欢异常!)无论如何,我的感觉是'不可能,所以为了这个问题,我希望我的感觉得到证实! :-)
-
当然,如果不允许异常,那么周围就没有人可以捕捉到异常。因此,析构函数不会运行并不重要,反正程序已经死了。
-
@Joe 你也许可以让你的同事相信异常并没有那么糟糕。大多数人将性能成本与它们联系在一起,但多年来并非如此。如今,异常在实际抛出之前基本上是免费的,而且这种情况应该发生——嗯——非常罕见。如果您搜索 c++ 零成本异常,您会找到可能对您有所帮助的参考资料。