2010-04-29 54 views
5

我已經設法通過我的C++遊戲編程生涯到目前爲止幾乎從未觸及異常,但最近我一直在與Ogre引擎一起開發項目,我正在努力學習正確。我在這裏發現了很多關於C++異常的一般用法的很好的問題和答案,但是我想從這裏得到一些外部意見,看Ogre的用法是否好,以及如何最好地使用它們。Ogre是否使用Exceptions是使用它們的好方法?

要下手,從它自己的異常類的食人魔的文檔引用:

OGRE從來沒有使用的返回值來指示錯誤。相反,如果發生錯誤,則拋出異常,並且這是封裝問題細節的對象。使用OGRE的應用程序應始終確保捕獲異常,因此所有OGRE引擎函數都應發生在try {} catch(Ogre :: Exception & e){}塊內。

真的嗎?每一個Ogre函數都會拋出一個異常並被包裝在一個try/catch塊中?目前這在我們的使用中通過主要的try/catch來處理,這將在退出之前顯示具有例外描述的消息框。這對於調試來說可能有些尷尬,儘管你沒有得到堆棧跟蹤,只是拋出錯誤的函數 - 更重要的是來自我們的代碼的函數,它稱爲Ogre函數。如果它是Ogre代碼中的一個斷言,那麼它將直接轉到調試器中的代碼,並且我將能夠更容易地找出發生了什麼 - 我不知道是否錯過了某些可以讓我調試異常已經?

我現在開始在我們的代碼中添加更多的try/catch塊,一般會考慮如果Ogre函數拋出異常是否重要。如果這會阻止一切正常工作,那麼讓主try/catch處理它並退出程序。如果它不是很重要,那麼只需在函數調用之後捕獲它並讓程序繼續。最近的一個例子是爲應用於實體的材質構建了一個頂點/片段程序參數向量 - 如果材質沒有任何參數,那麼它會拋出一個異常,我發現它並忽略它,不需要添加到我的參數列表中。這似乎是一種處理事物的合理方式嗎?任何與Ogre合作的具體建議都非常感謝。

回答

19

你不需要在try { ... } catch中包裹每一個最後的呼叫到食人魔。你可以在任何可以有意識地處理異常的地方進行。在某些情況下,這可能在個別呼叫站點,或者它可能處於某種高級循環中。如果你無法在任何地方有意義地處理它,就不要抓它;讓調試器接管。正因爲你引用的原因(至少在開發過程中,你不應該在生產中),你不應該在main()中發現異常。

+6

+1對於「無論哪裏都可以有意義地處理異常」 – Yacoby 2010-04-29 11:35:08

+0

那麼將有意義地處理異常適用於我最後一個查找參數的例子嗎?只要在異常之前沒有修改任何內容,那麼它不會導致任何問題。 timday指出如何調試異常,當他們被拋出,這將有助於很多,如果我在調試模式下取出主try/catch如果異常沒有被捕獲會發生什麼? – identitycrisisuk 2010-04-29 11:57:22

+0

當沒有捕獲到異常時,調試器會捕獲異常,並向您顯示從中拋出異常的位置。 – Christopher 2010-04-29 12:29:29

6

我對Ogre一無所知,恐怕不過了,但是有異常處理的一般規則是你儘可能地從throw site捕獲異常,但不要再做了。但是,只有引發異常的代碼使用RAII才能查看分配的資源時,纔有可能。如果代碼使用動態分配給普通指針或其他形式的手動資源管理,那麼你需要在呼叫站點嘗試塊。如果是這樣的話,我會說使用異常是一個壞主意。

+0

我認爲Ogre大多可以從一個資源分配的角度來看,它大部分都使用它自己的共享指針類(雖然他們不推薦你重用),你可以在你不再使用東西的時候把它清理乾淨。 – identitycrisisuk 2010-04-29 11:46:29

6

您似乎沒有意識到如何調試異常。 要麼

  • 調出VS調試/異常 對話框和蜱的C++異常 框。這會給你一個 機會(出現一個對話框)來調試何時拋出異常。

  • 如果你已經建立了食人魔源,在Ogre::Exception 構造函數設置一個斷點 ,當它試圖拋出一個你會 打破了調用堆棧,其中一個新的水平拋出網站。
+0

非常感謝,我知道會有東西,但不能完全找到它。也應該考慮構造函數斷點。 – identitycrisisuk 2010-04-29 11:48:56

相關問題