2015-06-06 60 views
2

假設的Foo構造函數不調用影響Windows errno或類似像GetLastError()狀態代碼的任何功能,是保證是否拋出異常影響錯誤號或一組最後一個錯誤代碼

throw Foo 

不影響任何這些價值。也就是說,我可以直接讀取錯誤代碼直到Foo的構造函數?如果沒有標準規定,我最感興趣的是GCC,GNU/Linux和MinGW-SJLJ變體的行爲。

回答

1

功能GetLastError()是Windows特定的和非標準的。異常不會影響返回值:只有調用OS函數纔會更新它(除非您致電SetLastError())。

然而,拋出異常具有對分別在範圍自動對象的潛在影響:

15.2/1作爲控制從那裏則拋出異常到一個處理程序的點通過,析構函數被調用用於所有自動對象 自嘗試塊輸入後構建。自動對象 以與其完成 構造相反的順序銷燬。

如果任何此類對象的析構函數包含對OS的調用,這可能會對GetLastError()產生影響。

總結:首先Foo構造函數被調用,那麼已經完全構造的局部對象的析構函數被調用時,終於拋出「轉讓的控制」到最近的異常處理程序。所以預計不會調用庫函數。該標準對任何基本流量控制語句使用相同的措詞(「傳輸控制」或「傳遞控制」),例如中斷,繼續和轉到。

+1

的確,但是,它是有保證的,那麼,異常處理代碼不使用任何這樣的系統調用? – Dolda2000

+0

但是在throw語句裏面有一些黑魔法我沒有完整的知識...... – user877329

+0

@ Dolda2000好吧,事實上,本地對象被破壞,它們的析構函數可能會調用OS函數(例如,如果fstream被打開) – Christophe

相關問題