我使用CMake創建我的項目。在該項目中,我主要使用Qt C++和一些用於硬件接口的MFC函數。在代碼中使用try/catch e-> ReportError()或其他一些異常聲明是否有意義?用Qt,MFC和CMake嘗試/捕捉
回答
你當然可以和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 documention。
** @ Mehrwolf **非常感謝。 – 2012-09-02 19:02:07
如果您使用MFC創建對話框,則只需要拋出指向CException派生對象的指針(如果拋出任何東西)。這是因爲DoModal
函數包含一個catch來恢復關鍵的應用程序狀態,然後是重新拋出;如果拋出任何其他類型的異常,它將被錯過,並且您的應用程序將被掛起。
我不知道Qt是否有類似的問題。
我沒有使用MFC創建任何對話框。我使用MFC進行硬件通信,並使用Qt進行GUI和對話框 – 2012-08-02 21:51:54
_這是因爲DoModal函數包含一個捕獲以恢復關鍵應用程序狀態,然後是重新拋出; @Mark Ransom CWnd :: InvokeHelper函數呢?該函數是否包含捕獲來恢復關鍵應用程序狀態? – 2012-08-03 20:37:51
@ViktorTarasov,我通過查看CDialog :: DoModal的來源發現了這一點。你也可以做到的。 – 2012-08-03 21:49:21
- 1. $就嘗試捕捉
- 2. Elixir嘗試捕捉
- 3. 嘗試抓住 - 不捕捉
- 4. 嘗試不捕捉WebException
- 5. 嘗試捕捉細節
- 6. Powershell的嘗試捕捉
- 7. 嘗試捕捉性能c#
- 8. Java嘗試/捕捉方法
- 9. 嘗試捕捉問題
- 10. 嘗試,捕捉問題
- 11. 嘗試捕捉恢復
- 12. C++嘗試捕捉做法
- 13. 嘗試捕捉執行
- 14. 嘗試和捕捉單詞的語句
- 15. 記錄插入和嘗試捕捉
- 16. 嘗試和捕捉不工作
- 17. 嘗試和捕捉laravel沒有$ id
- 18. 嘗試捕捉list_to_integer不捕獲錯誤
- 19. qt中全局嘗試和捕獲塊
- 20. 如何使用嘗試捕捉
- 21. 如何使用,甚至嘗試捕捉
- 22. 嘗試捕捉最後不捕捉異常
- 23. 嘗試捕捉最後包裝器
- 24. 錯誤的JavaScript嘗試捕捉
- 25. 放在哪裏嘗試捕捉
- 26. 嘗試捕捉與郵件問題
- 27. 正確的嘗試捕捉設計
- 28. 嘗試捕捉重複循環
- 29. 嘗試捕捉在SQL Server 2005
- 30. 變量在嘗試捕捉異常
你能否澄清一下cmake與異常處理有什麼關係? – 2012-08-02 21:20:35
我只詳細解釋瞭如何創建和編譯我的項目。 – 2012-08-02 21:29:07
是否使用異常與Qt,MFC甚至Cmake無關。 – log0 2012-08-02 21:33:48