2012-11-09 37 views
-2

我正在使用c + +,我在一個非常深的嵌套函數集,併發生了特殊情況,我想退出到頂層。使用什麼來代替異常?

現在我聽說現在已經棄用C++異常,所以我應該在這種情況下使用什麼呢?

所以我真正要問的是,setjmp()longjmp()確定在c + +代碼?

+3

我會說這是另一種方式,在C++中不推薦使用'setjmp' /'longjmp'(沒有堆棧展開,所以析構函數不會調用堆棧中的對象),而是支持異常。 –

+2

@JoachimPileborg'setjmp' /'longjmp'沒有正式棄用;他們出於C兼容性的原因,並將保持。但是你仍然不應該在C++中使用它們。 (即使在C語言中,它們的使用也可能會有問題)。 –

+0

如果你不想使用異常,你可以回到winapi/Qt的方法來返回每個函數調用的錯誤/成功代碼。我發現這種代碼風格非常冗長且容易出問題。使用例外沒有錯。他們不會消失或被棄用。 – Rook

回答

4

如果可能,我會避免在C++代碼中使用setjmp/longjmp作爲大多數C語言的東西。關於C++的例外情況,據我所知,它們是而不是已棄用。事實上,我認爲要在不嚴重妨礙向後兼容的情況下棄用這種普遍的功能是非常困難的。您可能已經聽說(某種形式的)異常規範最近的C++ 11標準的一個功能在語言的以前版本中不存在,在審批過程中已被棄用(請參閱,例如,Herb Sutter博客上的this post)。

這就是說,C++中的異常不易使用。 C++有很多功能,有時它們以非常複雜的方式相互作用。一些必要(但不充分)的建議是:

  • std::exception推導出您的例外;
  • 通過RAII管理您的資源;
  • 通過引用,而不是按值或指針捕獲。

但最好的建議是:明確地瞭解異常情況如何工作 - 防範意見不能正常工作。在此目的下,您可能會閱讀關於如何使用異常和RAII的this,this,thisthis。特別是「更有效的C++」有一整章專門討論異常,揭示了代碼顯然很簡單的一些錯綜複雜的後果。它提高了你對語言的整體認識。

+0

以前的標準中出現**異常規範**。舊形式'throw(type,type2,type3)'現在被稱爲_dynamic-exception-specification_並被棄用。新形式,使用'noexcept',不**已棄用 –

+0

@Jonathan Wakely:謝謝,修正。 –

11

C++的例外情況是而不是不推薦使用僅限於異常規範。
這兩者之間有區別。您應該使用RAII和例外。

+2

**動態**異常規格已被棄用。 'noexcept(true)'和'noexcept(false)'不會被棄用 –

+1

我幾乎可以直接說如果你使用C++而你不使用RAII,你錯過了其中一個最重要的語言好處。 – Rook

相關問題