使用Qt、MFC和CMake进行try/catch
try/catch with Qt, MFC and CMake
我使用CMake来创建我的项目。在该项目中,我主要使用QtC++和一些MFC函数作为硬件接口。在代码中使用try/catche->ReportError()或其他一些异常语句有意义吗?
如果使用MFC创建对话框,则只需要在抛出任何东西时抛出指向CException派生对象的指针。这是因为DoModal
函数包含一个catch来恢复关键应用程序状态,然后是一个re-show;如果您抛出任何其他类型的异常,它将被遗漏,并且您的应用程序将被挂起。
我不知道Qt是否也有类似的问题。
您当然可以将异常与Qt一起使用。问题是,它们有多有用。例如,考虑以下类别
class Thrower : public QObject
{
Q_OBJECT
public slots:
void throwException()
{
throw 42;
}
};
异常在插槽中引发。要捕获此异常,必须包装触发时隙的信号,在try
块中,例如
class Catcher : public QObject
{
Q_OBJECT
public:
Catcher(Thrower* t)
{
connect(this, SIGNAL(test()), t, SLOT(throwException()));
}
void catchTest()
{
try
{
emit test(); // Will trigger Thrower::throwException().
}
catch (int number)
{
qDebug() << "Caught" << number;
}
}
signals:
void test();
};
不幸的是,并非总是可以使用这种方法。例如,将QPushButton::clicked()
连接到Thrower::throwException()
时,单击按钮将导致事件循环崩溃。
您可以将QApplication::exec()
封装在try
块中,但当您捕获异常时,GUI很可能已经被破坏,因此不可能从异常中恢复。
还可以查看有关异常安全的Qt文档。
相关文章:
- 通过递归进行因子分解
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 使用libgit2、c++进行pull
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何使用模板函数的函数签名进行SFINAE
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 将模板化的类型与C++中的某些类/类型进行比较
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 从文本文件中读取时钟时间和事件时间并进行处理
- 对字符串进行位操作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 是否可以对零模板参数进行模板专门化
- 当无法进行RAII时,如何在C++中"try/finally"?
- 在 C++ 中使用 try-catch 进行删除 [] 或删除操作是否必要
- 使用Qt、MFC和CMake进行try/catch
- 如何在这个try-show-catch代码中对异常进行排序