2012-08-02 80 views
0

我使用CMake創建我的項目。在該項目中,我主要使用Qt C++和一些用於硬件接口的MFC函數。在代碼中使用try/catch e-> ReportError()或其他一些異常聲明是否有意義?用Qt,MFC和CMake嘗試/捕捉

+0

你能否澄清一下cmake與異常處理有什麼關係? – 2012-08-02 21:20:35

+0

我只詳細解釋瞭如何創建和編譯我的項目。 – 2012-08-02 21:29:07

+1

是否使用異常與Qt,MFC甚至Cmake無關。 – log0 2012-08-02 21:33:48

回答

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 documention

+0

** @ Mehrwolf **非常感謝。 – 2012-09-02 19:02:07

1

如果您使用MFC創建對話框,則只需要拋出指向CException派生對象的指針(如果拋出任何東西)。這是因爲DoModal函數包含一個catch來恢復關鍵的應用程序狀態,然後是重新拋出;如果拋出任何其他類型的異常,它將被錯過,並且您的應用程序將被掛起。

我不知道Qt是否有類似的問題。

+0

我沒有使用MFC創建任何對話框。我使用MFC進行硬件通信,並使用Qt進行GUI和對話框 – 2012-08-02 21:51:54

+0

_這是因爲DoModal函數包含一個捕獲以恢復關鍵應用程序狀態,然後是重新拋出; @Mark Ransom CWnd :: InvokeHelper函數呢?該函數是否包含捕獲來恢復關鍵應用程序狀態? – 2012-08-03 20:37:51

+0

@ViktorTarasov,我通過查看CDialog :: DoModal的來源發現了這一點。你也可以做到的。 – 2012-08-03 21:49:21