簡體   English   中英

發出Qt信號時是否有可能引發異常?

[英]Is there any possibility to throw an exception when emitting a Qt signal?

在查看一些代碼時,我發現了一段類似的代碼:

struct MyFooStructure
{
  //Nothing unusual, just basic types
}

class Foo : public QObject
{
   Q_Object

public:
   void fooMethod(const MyStructure &s);

signals:
   void fooSignal(const MyStructure &);
}

void Foo::fooMethod(const MyStructure &s)
{
   try
   {
      emit fooSignal(s)
   }
   catch(const std::exception &e)
   {
      qDebug() << "An exception!";
   }
}

這里有沒有可能進入漁獲? 據我所知,沒有引發異常的可能: 發出只是一個宏,用於創建表以調用連接到* .moc文件上該信號的適當函數 那真的很需要嘗試嗎?

是的,在您的示例中,至少在連接到fooSignal任何插槽拋出std::exception ,都需要使用catch。

該語句emit fooSignal(); 同步調用所有連接的插槽。 基本上, QObject內部有一個連接表,其中存儲了一個對象的所有連接,每個插槽都是一個函數指針。 本質上來說, emit所做的事情(或者更確切地說,是由moc生成的fooSignal實現)所做的是,它簡單地遍歷了連接表並為每個連接的插槽調用了所有函數指針。

所以槽從連接語句調用。 這也意味着,如果有任何插槽拋出異常,則該異常將傳播到emit語句之外。

請注意,內部的fooSignal moc生成代碼fooSignal才是異常安全的,請參閱此錯誤報告中 Olivier的回答。 這意味着較早版本的Qt無法處理在插槽中引發的異常,並且如果插槽引發異常,moc生成的代碼將以未定義的方式失敗。

編輯:我還想補充一下,有拋出異常的插槽是一種不好的做法,請嘗試避免這種情況。 調用emit的代碼不知道連接了哪些插槽,因此也不知道需要捕獲哪些異常。 此外,一旦您將連接而不是直接連接排入隊列,插槽將被異步調用而不是同步調用,您將無法捕獲插槽的異常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM