如果构造函数中发生错误,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 会做啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个核心转储错误发生在我的课堂上?我已经包含了复制构造函数、复制赋值和析构函数
如果我正在读取的字节还不存在,BinaryReader 会做啥?