如果构造函数中发生错误,Qt 会做啥? [复制]

Posted

技术标签:

【中文标题】如果构造函数中发生错误,Qt 会做啥? [复制]【英文标题】:What does Qt do if an error occurs in a constructor? [duplicate]如果构造函数中发生错误,Qt 会做什么? [复制] 【发布时间】:2018-01-24 03:17:52 【问题描述】:

如果类的构造函数发生错误,一般建议引发异常。

在 Qt 中,没有一个类抛出异常(据我所知)。

Qt 如何处理构造函数中发生的错误?

【问题讨论】:

阅读以下内容:doc.qt.io/qt-5/exceptionsafety.html, doc.qt.io/qt-5/qexception.html 感谢您的链接。但是,他们只是回答了我的第一个问题。构造函数中的错误呢? 尽量不要把东西放在可能会失败的构造函数中。实现exception safe constructors。 @Velkan 可能,因为有很多新手问题的评论是足够的(而不是完整的格式正确的答案)。例如,这个问题与 Qt 完全无关,它是关于 C++ 基础的。 @AndreiR。 new QThing() 中可能抛出std::bad_alloc 的部分是全局operator new,而不是QThing::Qthing()。构造函数是后者。 【参考方案1】:

正如你所说的 Qt 不使用异常,在 Qt 端构建 QObject 不会失败(C++ 内存分配仍然可能失败)。

您认为构造函数中的哪种错误? 如有必要,Qt 将创建具有 invalid 状态的对象,在我看来,这不是应该取消对象创建的构造函数错误,而是更多的 not-fully-initialized-yet-to-工作良好对象状态。

例子:

QRegExp regex1; // isValid() : false
QRegExp regex2("nop"); // isValid() : false
// regex2.errorString() => "bad repetition syntax"

QSqlDatabase db; // isValid() : false

QDate date1; // isValid() : false
QDate date2(0, 0, 0); // isValid() : false
QDate date3(-1, 0, 1024); // isValid() : false

QString str1; // isNull() : true, isEmpty() : true
QString str2(""); // isNull() : false, isEmpty() : true

【讨论】:

我心中的错误可能是打开文件。考虑一个需要使用文件进行某些操作的类。如果文件不能打开,那么创建这个类的对象是没有用的。并感谢您的回答。正如我从您的回答中了解到的那样:Qt 只是设置了一个变量来通知该对象无效。 没错,这样做有一个好处:你可以返回对象(即使创建失败)而不是错误代码,然后检查它们的有效状态,你也可以在需要的容器中使用它们默认构造函数等。即使无法使用对象,拥有无效对象也有助于简化编码。

以上是关于如果构造函数中发生错误,Qt 会做啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个核心转储错误发生在我的课堂上?我已经包含了复制构造函数、复制赋值和析构函数

如果没有顺序的内存空间,realloc 会做啥?

在这种情况下,“重新加载”会做啥? [复制]

如果我正在读取的字节还不存在,BinaryReader 会做啥?

如果 file.txt 没有暂存,`git commit file.txt` 会做啥?

这个构造函数和析构函数发生了啥?