Qt也不例外.这对C++代码有何影响

Qt is not exception safe. How does this impact C++ code?

本文关键字:影响 何影响 也不例外 这对 C++ 代码 Qt      更新时间:2023-10-16

Qt目前不是异常安全的,似乎也不可能是异常安全的。这对与Qt交互的C++代码有什么限制?

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

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

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

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

*即使在这里,也有可能结束一切。例如,您不能抛出线程联接、条件等待等,但您可以构建未来和执行器,以干净的方式在线程之间传递异常。使用相同类型的脚手架,可以通过槽传递异常。但这是相当重的脚手架,你最终会得到一个与典型的Qt程序非常不同的API,所以这似乎不值得。