我使用CMake创建我的项目。在项目中,我主要使用Qt C ++和一些MFC函数用于硬件接口。在代码中使用 try / catch e-> ReportError()或其他一些异常语句是否有意义?
答案 0 :(得分:1)
如果你正在使用MFC来创建一个对话框,你只想抛出指向CException派生对象的指针,如果你扔掉任何东西的话。这是因为DoModal
函数包含一个catch来恢复关键应用程序状态,然后重新抛出;如果你抛出任何其他类型的例外,它将被遗漏,你的申请将被挂起。
我不知道Qt是否有类似的问题。
答案 1 :(得分: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
块中,但是当您捕获异常时,GUI很可能已经被破坏,因此无法从异常中恢复。
另请参阅有关异常安全的Qt documention。