where am I supposed to catch it?
這就是爲什麼Qt不支持跨信號/插槽連接拋出異常。如果你嘗試,你會看到這樣一條消息:
Qt has caught an exception thrown from an event handler. Throwing exceptions from an event handler is not supported in Qt. You must reimplement QApplication::notify() and catch all exceptions there.
因爲它提到,有可能繼承的QApplication和趕上你的例外存在,但是這將是處理事情非常惱人的方式。
如果可能的話,我會建議重寫量,使得它不會拋出。
如果你不能重寫count()?
例如,如果計數()是在第三方庫中的函數的一部分,你使用的是什麼?
在任何官方Qt庫沒有插槽拋出,因此,如果您使用的是第三方的庫拋出一個插槽,它可能是一個跡象,表明它不是一個好的圖書館。如果一定要使用的話,我建議,而不是QApplication::notify
捕捉它,你不是創建一個適配器。
這是什麼意思?首先創建一個對象,在構造函數中使用粗略的第三方對象。在它中,寫一個插槽,用try/catch塊封裝一個調用投擲槽。現在,而不是連接到粗略第三方對象的插槽,連接到您的新創建的對象的插槽。
通過這種方式捕獲異常會將相關代碼保存在一起,並且如果遇到多個這些有問題的函數時,阻止QApplication::notify
填充大量不相關的try/catch塊。
例如:
class BadCounter {
Q_OBJECT
public slots:
void count() { throw CounterError("unable to count"); }
};
class CounterAdaptor {
Q_OBJECT
BadCounter* counter_;
public:
CounterAdaptor(BadCounter* counter) {
counter_ = counter;
}
public slots:
void count() {
try {
counter_->count();
} catch (const CounterError& e) {
std::cerr << e.what() << std::endl;
}
}
};
int main() {
BadCounter engine;
CounterAdaptor adaptor(&engine);
QThread* thread = new QThread();
connect(thread,SIGNAL(started()),&adaptor,SLOT(count()));
thread.start();
... // etc...
delete thread;
}
如果你要處理的東西,可以從任何地方被拋出?
這種全球關注的最明顯的例子是意外的異常。錯誤可能發生在任何地方。儘可能多地記錄事件的細節是可取的,因此可以識別和糾正原因。在這種情況下,你會希望中所示jichi's answer在自己的子類重新實現QApplication::notify
。使用全局處理程序來處理全局問題是非常合理的。
也許你應該把try-catch塊在count()函數。 .. – Kobe 2012-04-09 15:52:47
#vBx計數拋出 – smallB 2012-04-09 15:55:49
那麼你的解決方案提供的問題是好的 – Kobe 2012-04-09 15:58:22