我已經設法通過我的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合作的具體建議都非常感謝。
+1對於「無論哪裏都可以有意義地處理異常」 – Yacoby 2010-04-29 11:35:08
那麼將有意義地處理異常適用於我最後一個查找參數的例子嗎?只要在異常之前沒有修改任何內容,那麼它不會導致任何問題。 timday指出如何調試異常,當他們被拋出,這將有助於很多,如果我在調試模式下取出主try/catch如果異常沒有被捕獲會發生什麼? – identitycrisisuk 2010-04-29 11:57:22
當沒有捕獲到異常時,調試器會捕獲異常,並向您顯示從中拋出異常的位置。 – Christopher 2010-04-29 12:29:29