c++ - Qt 不是异常安全的。这对 C++ 代码有何影响?

标签 c++ qt exception

Qt 是 not currently exception safe似乎也不是ever likely to be .这对与 Qt 交互的 C++ 代码有什么限制?

如果我想使用 Qt,是否需要在我的代码中避免所有 C++ 异常?

最佳答案

您可以对要在应用程序中使用的任何其他非异常安全库执行相同的两件事:将其隔离在异常安全包装器中,或者放弃异常并适应其样式。您真正要问的是第一个是否可行。

对于您的字面问题,您绝对不需要避免所有异常。所有返回错误代码的 Qt 函数、未正确清理自身的类等都可以很容易地结束。而且您没有充分的理由在 Qt 中抛出异常,所以您不能抛出异常也没有关系。而且您不会经常将 Qt 对象传递给依赖于异常的非 Qt 库。等等。最棘手的是它让它思考如何编写,例如,一个 QImage 包装器,如果真正的构造函数以无效值成功,它将销毁并抛出,这并不难。

但最大的问题是您不能通过信号槽连接抛出异常。如果你想以典型的方式组织你的代码,低级函数抛出大部分异常,顶级函数做大部分异常处理,但你想使用 Qt 作为你的大部分中间层,那可能不是会很愉快。* 例如,对于传统的重型 Controller MVC 设计,其中大部分 Controller 都是基于 Qt 构建的,您对异常的使用最终将非常局限并且没有那么大的帮助。另一方面,对于 MVA 设计或智能模型设计,您的大部分逻辑可能根本不直接处理 Qt,因此您仍然可以在相当大的范围内处理异常。 (当然,前提是您不会在不必要的地方使用 Qt。)

* 即使在这里,也可能把事情包起来。例如,您不能跨线程连接、条件等待等抛出异常,但您可以构建以干净的方式在线程之间传递异常的 futures 和执行器。使用相同类型的脚手架,您可以通过插槽传递异常。但这是相当繁重的脚手架,你最终会得到一个与典型 Qt 程序完全不同的 API,所以它似乎不值得。

关于c++ - Qt 不是异常安全的。这对 C++ 代码有何影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26643602/

相关文章:

c++ - stdout 和 stderr 字符编码

c++ - 如何使用 Boost Graph Library 使用循环在图中设置相同的边权重?

c++ - 为什么空指针解引用不是异常

c# - 倾斜动画无法制作动画

exception - 异步异常的嵌套屏蔽

c++ - 当我添加语句时,C++ 中的结果输出错误

c++ - 为什么静态成员函数_declared_是静态的,而在C++中却是_defined_?

c++ - "QApplication app(argc, argv)"试图做什么?

c++ - Qt3D动态贴图

c++ - 创建共享指针的首选方式