是食人魔';使用异常是使用异常的好方法吗? 我已经成功地完成了我的C++游戏编程生涯,到目前为止,几乎从未碰到过例外,但最近我一直在与OGRE引擎合作,我正努力学习。关于C++异常的一般用法,我在这里发现了很多很好的问题和答案,但是我想从这里得到一些关于OGRE用法是否好以及如何最好地使用它们的外部观点。

是食人魔';使用异常是使用异常的好方法吗? 我已经成功地完成了我的C++游戏编程生涯,到目前为止,几乎从未碰到过例外,但最近我一直在与OGRE引擎合作,我正努力学习。关于C++异常的一般用法,我在这里发现了很多很好的问题和答案,但是我想从这里得到一些关于OGRE用法是否好以及如何最好地使用它们的外部观点。,c++,exception,visual-studio-2005,ogre3d,C++,Exception,Visual Studio 2005,Ogre3d,首先,引用Ogre自己的异常类文档: 食人魔从不使用返回值来表示错误。相反,如果发生错误,将抛出异常,这是封装问题细节的对象。使用OGRE的应用程序应该始终确保捕获异常,因此所有OGRE引擎函数都应该出现在try{}catch(OGRE::Exception&e){}块中 真的吗?每一个食人魔函数都会抛出一个异常并被包装在一个try/catch块中?目前,在我们使用它时,这是通过一个try/catch-in-main来处理的,它将在退出之前显示一个带有异常描述的消息框。这对于调试来说可能有点尴尬

首先,引用Ogre自己的异常类文档:

食人魔从不使用返回值来表示错误。相反,如果发生错误,将抛出异常,这是封装问题细节的对象。使用OGRE的应用程序应该始终确保捕获异常,因此所有OGRE引擎函数都应该出现在try{}catch(OGRE::Exception&e){}块中

真的吗?每一个食人魔函数都会抛出一个异常并被包装在一个try/catch块中?目前,在我们使用它时,这是通过一个try/catch-in-main来处理的,它将在退出之前显示一个带有异常描述的消息框。这对于调试来说可能有点尴尬,因为你没有得到堆栈跟踪,只有抛出错误的函数——更重要的是我们代码中调用Ogre函数的函数。如果它是Ogre代码中的一个断言,那么它将直接进入调试器中的代码,我将能够更容易地发现发生了什么-我不知道我是否遗漏了允许我调试异常的内容


我现在开始在我们的代码中添加更多的try/catch块,通常考虑如果Ogre函数抛出异常是否重要。如果它会停止一切工作,那么让主try/catch处理它并退出程序。如果它不是很重要,那么就在函数调用之后捕捉它,让程序继续。最近的一个例子是为应用于实体的材质构建顶点/片段程序参数向量——如果材质没有任何参数,它将抛出异常,我捕获了异常,然后忽略了异常,因为它不需要添加到我的参数列表中。这似乎是一种合理的处理方式吗?任何与食人魔合作的具体建议都非常感谢

你不需要在
try{…}catch
中包装对食人魔的最后一次调用。只要你能有意义地处理异常,你就可以在任何地方这样做。在某些情况下,这可能在单个调用站点,也可能在某种高级循环中。如果你在任何地方都不能有意义地处理它,那就不要抓住它;让调试器接管


特别是,您不应该在
main()
中捕获异常,原因正是您引用的原因(至少在开发过程中不应该捕获异常;您应该在生产过程中捕获异常)。

恐怕我对食人魔一无所知,但异常处理的一般规则是,您尽可能从抛出站点捕获异常,但是没有更多。然而,只有当抛出异常的代码使用RAII来管理分配的资源时,这才是可能的。如果代码对普通指针使用动态分配,或者使用其他形式的手动资源管理,那么您需要在调用站点使用try块。如果是这种情况,我会说使用异常是个坏主意。

您似乎不知道如何调试异常。 或者

  • 打开VS调试/异常 对话框并勾选C++异常 盒子。这会给你一个机会 当出现错误时进行调试的机会(出现一个对话框) 异常被抛出

  • 如果你已经建立了食人魔源代码,设置一个
    Ogre::Exception中的断点
    构造函数,当它试图抛出一个时,您将与它决裂
    一个调用堆栈,其中下一级是抛出站点

+1表示“只要你能有意义地处理异常”,那么有意义地处理异常是否适用于我最后一个查找参数的示例?只要在异常之前没有修改任何内容,那么它就不会引起任何问题。timday指出了在抛出异常时如何调试异常,这将非常有帮助,如果我在调试模式中去掉主try/catch,如果未捕获异常,会发生什么?如果未捕获异常,调试器将捕获它,并向您显示抛出异常的位置。@identitycrisisuk:当然,只要对应用程序的状态有意义,您就有权放弃您想要的任何异常。请记住,异常是昂贵的,所以您不希望它们以帧速率发生。但如果是在渲染资源的配置过程中,这应该不会太重要。未捕获的异常被调试器捕获;应该就好像在抛出异常的点设置了断点(完整堆栈跟踪、检查变量和堆栈帧等)。@Marcelo谢谢,关于这一点,我的所有问题都解决了。我将在调试模式下删除主try/catch,但将其保留在那里以供发布,因此它就像一个崩溃捕捉器对话框。我认为我可以在发生时处理一个异常,但将来我会尝试修复它的源代码,而不是让它在运行时发生。我认为从资源分配的角度来看,Ogre基本上是可以的,它大部分使用自己的共享指针类(他们不建议您重用该类…)一旦你不再使用这些东西,你就可以把它清理干净。非常感谢,我知道会有东西,但找不到。也应该考虑构造函数断点。