我使用 CMake 来创建我的项目。在项目中,我主要使用 Qt C++ 和一些 MFC 函数作为硬件接口。在代码中使用try/catch e->ReportError()或其他一些异常语句是否有意义?
问问题
1741 次
2 回答
1
如果您使用 MFC 创建一个对话框,那么您将只想抛出指向 CException 派生对象的指针(如果您抛出任何东西)。这是因为该DoModal
函数包含一个 catch 来恢复关键应用程序状态,然后重新抛出;如果您抛出任何其他类型的异常,它将被遗漏并且您的应用程序将被挂起。
我不知道Qt是否有类似的问题。
于 2012-08-02T21:43:56.470 回答
0
您当然可以将异常与 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
-block 中,但是当您捕获异常时,GUI 很可能已经被破坏,因此实际上不可能从异常中恢复。
还可以查看有关异常安全的Qt 文档。
于 2012-09-02T15:21:22.260 回答