2012-12-20 25 views
3

我對C++異常兩個問題/反射/疑惑:C++異常(使用提示)

  1. IMO當我們想到在代碼中使用異常,我們必須做出明確的決定 - 總是使用異常或不使用他們。這說明了應用程序如何處理錯誤,並且代碼更易於閱讀。我也總是認爲,有些東西可能會拋出異常,並且我幾乎在任何地方都放置try/catch塊。我的「規則」是否合理?

  2. STL類和算法產生的所有異常都是從std::exception派生的嗎?我的例外課程始終來自標準課程(runtime_errorlogic_error等)。我想知道我是否可以安全地將catch (...)替換爲catch(const std::exception& object),因爲第二個總是提供有關異常原因的一些信息。

+1

這很好,假設一切都會拋出異常。但是如果你需要清理或者「處理」一個異常,只有「catch」。不要隨機發生異常。 –

+4

這些try/catch塊的用途是什麼?如果你不能處理這個異常,當然你不應該接受它。聽起來像你無緣無故地捕捉它們。另外,[看看這個視頻](http://channel9.msdn。COM /顯示/去+深/ C-和超越-2012-安德烈 - Alexandrescu的系統性,錯誤處理 - 在-C)。是的,所有異常類都應該從'std :: exception'繼承。爲了完整性,你通常應該在主底部有一個「catch(...)」。但無論如何,這並不具有建設性,因爲它沒有明確的答案。 – GManNickG

+0

@GManNickG謹慎發佈,作爲答案,我可以upvote? –

回答

2

對於第一部分,這是一個值得了解的C++異常,在關係中時,你應該把他們的時候,你應該抓住他們,爲什麼他們是有用的,和很多其他有用的東西。 http://www.parashift.com/c++-faq/exceptions.html

至於第二部分,據我知道,如果你正趕上從STL異常,你應該使用安全(常量的std ::例外&對象)

0
  1. 我知道你意思。史蒂夫mcConnell在代碼完成中寫道,例外只應在例外的情況下使用I.e.如果你真的希望有東西在那裏,比如硬盤空間或數據庫連接。他繼續說,例外情況不應使用用於控制流程。這是錯誤代碼發揮作用的地方。我會在適當的地方使用。

  2. 應該有一種方法來確定std模板庫中的例外的基本類型。在我的經驗,一切從派生的std ::例外

+0

我在第1點有點贊同你。因爲例外是昂貴的。當返回值更合適時,不要拋出異常。您可以編寫一個宏來包裝返回值檢查,以使其簡潔易讀。 – Matt

0

對於你的第二個問題,是的,在標準庫拋出的所有異常的std::exception派生。

你的第一個問題很難給出具體的答案。在任何非平凡的計劃中,完全避免例外是非常困難的。我認爲Herb Sutter很好地穿過它here

0

這些try/catch塊的目的是什麼?如果你不能處理這個異常,當然你不應該接受它。聽起來像你無緣無故地捕捉它們。

此外,看看這個視頻:C++ and Beyond 2012: Andrei Alexandrescu - Systematic Error Handling in C++

是的,所有的異常類都應該繼承std :: exception。爲了完整性,你通常應該在主底部有一個catch(...)。