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

2023-12-24

Qt is 当前不是异常安全的 http://qt-project.org/doc/qt-5/exceptionsafety.html似乎也不是曾经有可能是 http://permalink.gmane.org/gmane.comp.lib.qt.devel/12004。这对与 Qt 交互的 C++ 代码有什么限制?

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


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

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

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

* Even here, it's possible to wrap things up. For example, you can't throw across a thread join, condition wait, etc., but you can build futures and executors that pass exceptions between threads in a clean way. With the same kind of scaffolding, you could pass exceptions through slots. But that's reasonably heavy scaffolding, and you'll end up with a pretty different API than a typical Qt program, so it doesn't seem worth it.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt 不是异常安全的。这对 C++ 代码有何影响? 的相关文章

随机推荐