Qt异常处理

初步警告:异常安全功能不完整!一般情况下应该可以工作,但类仍然可能泄漏甚至崩溃。

Qt本身不会抛出异常。而是使用错误码, 但是C++可能会抛出异常。此外,有些类有用户可见的错误消息,例如QIODevice::errorString()或QSqlQuery::lastError()。这有历史和现实的原因——打开异常可能会使库的大小增加20%以上。

下面几节将描述Qt在编译时启用异常支持时的行为。

容器

Qt的容器类通常是异常中立的。它们将在包含的类型T中发生的任何异常传递给用户,同时保持内部状态有效。

例子:

QList<QString> list;
...
try {list.append("hello");
} catch (...) {
}
// list is safe to use - the exception did not affect it.

抛出异常的容器类型可能是在在赋值或复制构造期间。对于这些类型,修改容器并返回值的函数使用起来是不安全的:

MyType s = list.takeAt(2);

在赋值s期间发生异常,因为赋值给s之前,索引2处的值已经从容器中移除。它已经被丢弃,没有恢复的机会。
正确的写法是:

MyType s = list.at(2);
list.removeAt(2);

如果赋值操作抛出,容器仍将包含该值;无数据丢失。
注意,隐式共享Qt类不会抛出它们的赋值操作符或复制构造函数,因此上面的限制不适用。

内存不足处理

大多数桌面操作系统都过度使用内存。这意味着即使在分配内存时没有足够的可用内存,malloc()或new运算符也会返回一个有效的指针。在这种系统上,不会抛出std::bad_alloc类型的异常。

在其他所有操作系统上,如果任何内存分配失败,Qt都会抛出类型为std::bad_alloc的异常。如果系统内存不足,或者没有足够的连续内存来分配请求的大小,那么分配可能会失败。

该异常情况有文档说明。例如,如果内存不足,QImage构造函数将创建一个null图像,而不是抛出异常。

从异常中恢复

目前,从Qt中抛出的异常(例如内存不足)中恢复的唯一支持用例是退出事件循环并在退出应用程序之前进行一些清理。

典型用例:

QApplication app(argc, argv);
...
int ret;
try {ret = app.exec();
} catch (const std::bad_alloc &) {// clean up here, e.g. save the session// and close all config files.return EXIT_FAILURE; // exit the application
}
...
return ret;

抛出异常后,与窗口服务器的连接可能已经关闭。在捕获异常后调用GUI相关函数是不安全的。

客户端代码中的异常

信号与槽位

从Qt的信号槽连接机制调用的槽中抛出异常被认为是未定义的行为,除非它在槽内处理:

State state;
StateListener stateListener;// OK; the exception is handled before it leaves the slot.
QObject::connect(&state, SIGNAL(stateChanged()), &stateListener, SLOT(throwHandledException()));
// Undefined behaviour; upon invocation of the slot, the exception will be propagated to the
// point of emission, unwinding the stack of the Qt code (which is not guaranteed to be exception safe).
QObject::connect(&state, SIGNAL(stateChanged()), &stateListener, SLOT(throwUnhandledException()));

如果像常规函数调用一样直接调用槽,则可能使用异常。这是因为直接调用槽时绕过了连接机制:

State state;
StateListener stateListener;// ...try {// OK; invoking slot directly.stateListener.throwException();
} catch (...) {qDebug() << "Handling exception not caught in slot.";
}

Exception Safety | Qt 5.15

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/858420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android笔记-安装Termux开启ssh,安装vim、android-tool、python等

背景 家里面有个老手机&#xff0c;想将此手机做成一个家庭服务器。控制各种家电。目前准备先控制电视机 流程 用电脑usb连接手机&#xff0c;下载好Termux&#xff0c;在安卓手机上安装好。这里就不记录笔记了&#xff0c;各个手机不一样。 安装好进入手机后&#xff1a; …

Java短路逻辑运算符

Java中的运算符还有短路运算符。 其中就有符号 && 和 || 符号 作用 说明 && 短路与 结果和&相同&#xff0c;但是有短路效果 || 短路或 结果和|相同&#xff0c;但是有短路效果 注意事项&#xff1a; &和|&…

SIM卡将成为历史

近期苹果发布了全新款的 iPad Pro 和 iPad Air&#xff0c;这些新品不仅在性能和设计上带来了令人惊叹的进步&#xff0c;还悄然迎来了一项重要改变&#xff1a;eSIM 技术的支持。此次发布的蜂窝版本 iPad Pro 和 iPad Air 都不再配备物理 SIM 卡槽&#xff0c;这标志着苹果在推…

mfc140.dll是什么文件?mfc140.dll文件下载安装办法

一、mfc140.dll文件功能与作用 mfc140.dll作为Microsoft Foundation Classes库的一部分&#xff0c;提供了一系列的基础功能&#xff0c;这些功能对于开发Windows桌面应用程序至关重要。 2.1 应用程序框架 mfc140.dll封装了应用程序的生命周期管理&#xff0c;包括初始化、运…

Gorm 基础:表映射

这篇文章将以创建事件时间记录功能为示例&#xff0c;介绍如何使用 Gorm 完成数据库表的基本映射、简单的创建表数据操作和注意事项。 数据库表设计 设计一个事件时间记录功能通常需要记录事件的开始时间、结束时间和事件类型&#xff0c;以及一些额外的功能&#xff0c;像事…

代码生成技术技术-janino

文章目录 背景简单例子flink 例子 背景 代码生成技术适合在需要动态代码编译的场景中使用。比如大数据计算场景下&#xff0c;经常会要把flink sql 转成实际的执行计划 简单例子 代码是一个string 类型&#xff0c;直接用janino 编译后&#xff0c;就可以得到加载到jvm里的c…

北京地铁用什么数据结构来处理

北京地铁信息查询系统或相关数据分析系统可能会使用多种数据结构来高效地处理和存储信息。以下是几种可能用到的数据结构及其用途&#xff1a; 图&#xff08;Graph&#xff09;&#xff1a;北京地铁线路可以被建模为一个有向加权图&#xff0c;其中每个站点是一个节点&#xf…

赶论文不用愁:如何利用ChatGPT在3小时内完成论文

在这份指南里&#xff0c;我将详细介绍如何运用ChatGPT 4.0的高级功能来辅助学术研究与文章写作。从挖掘研究课题的初步想法开始&#xff0c;到撰写一篇内容深刻、结构完整的学术论文&#xff0c;我将逐步演示如何在研究的各个阶段中充分利用ChatGPT。值得一提的是&#xff0c;…

编程精粹—— Microsoft 编写优质无错 C 程序秘诀 07:编码中的假象

这是一本老书&#xff0c;作者 Steve Maguire 在微软工作期间写了这本书&#xff0c;英文版于 1993 年发布。2013 年推出了 20 周年纪念第二版。我们看到的标题是中译版名字&#xff0c;英文版的名字是《Writing Clean Code ─── Microsoft’s Techniques for Developing》&a…

POSTMAN接口详解

Postman接口详解 Postman 是一个流行的API开发工具&#xff0c;广泛应用于测试、开发和文档编写。它支持发送各种HTTP请求&#xff0c;管理请求参数、标头、认证和脚本&#xff0c;帮助开发者快速调试和验证API接口的正确性。以下是对Postman接口的详细讲解。 Postman基本功能…

二进制炸弹的fp是什么?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

微信小程序组件

微信小程序组件课后小结 引言 随着移动互联网的快速发展&#xff0c;微信小程序已经成为开发者和用户的重要选择之一。小程序以其轻量化、易用性和高效性&#xff0c;为开发者提供了一种全新的开发方式&#xff0c;也为用户带来了更加便捷的服务体验。本文将对微信小程序组件的…

BigDecimal 小数位的处理(RoundingMode)

前言&#xff1a; 在日常项目开发中&#xff0c;接触小数是常有的事情&#xff0c;而产品对于小数的处理&#xff0c;在不同的业务中有不同的定义&#xff0c;比如四舍五入、截取、向上舍位、向下舍位等等场景&#xff0c;面对如此多的场景&#xff0c;你是否会束手无策&#…

【算法】优先级队列-基础与应用

优先级队列&#xff08;Priority Queue&#xff09;是一种特殊的队列类型&#xff0c;它允许在其元素中分配优先级。与传统的先进先出&#xff08;FIFO&#xff09;队列不同&#xff0c;优先级队列中元素的出队顺序取决于它们的优先级。优先级较高的元素会被优先处理&#xff0…

IOS Swift 从入门到精通: 结构体的访问控制、静态属性和惰性

文章目录 初始化器引用当前实例惰性属性静态属性和方法访问控制总结初始化器 初始化器是一种特殊方法,可提供创建结构体的不同方式。所有结构体都默认带有一个初始化器,称为成员初始化器- 它会要求您在创建结构体时为每个属性提供一个值。 User如果我们创建一个具有一个属性…

windows桌面运维---第八天

1、如何判断环路&#xff1a; 1、执行ping命令&#xff1a;网络测试时发现丢包严重&#xff0c;可能是环路引起的 2、监控MAC地址漂移&#xff1a;频繁的MAC漂移是环路的一个迹象。 3、通过display interface brief | include up命令&#xff0c;查看所有UP接口下的流量 2、…

【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

学习第一天&#xff1a;2024-3-9 文章目录 Qt creator 快捷键帮助文档默认生成的main.cpp逐行解释核心类帮助文档的查阅方法-①代码创建按钮第一个第二个对窗口的其他设置 对象树窗口坐标系信号和槽&#xff08;优点&#xff1a;松散耦合&#xff09;帮助文档的查阅方法-②找信…

价格减免(Lc2288)——模拟

句子 是由若干个单词组成的字符串&#xff0c;单词之间用单个空格分隔&#xff0c;其中每个单词可以包含数字、小写字母、和美元符号 $ 。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个 价格 。 例如 "$100"、"$23" 和 …

轨迹规划系列之S型速度曲线绝对值定位功能块(Codesys源代码)

1、轨迹规划的作用 轨迹规划的作用(前馈速度+位置插补)-CSDN博客文章浏览阅读13次。轨迹规划可以产生运动控制系统位置闭环控制所需要的前馈速度和插补位置值。前馈速度+PID位置闭环控制典型应用可以参考下面文章链接:1、S7-1200PLC和V90伺服通过工艺对象实现定位控制S7-1200…

Java中的加密与解密:实现安全的数据传输

Java中的加密与解密&#xff1a;实现安全的数据传输 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在当今信息安全至关重要的时代&#xff0c;保护数据的安全性…