ide*_*suk 5 c++ visual-studio-2005 exception ogre3d
我已经设法通过我的C++游戏编程职业生涯到目前为止几乎从未接触过异常,但最近我一直在研究一个带有Ogre引擎的项目,我正在努力学习.我在这里找到了很多关于C++异常的一般用法的好问题和答案,但是我想从这里得到一些关于Ogre的使用是否良好以及如何最好地使用它们的外部意见.
首先,引用Ogre关于它自己的Exception类的文档:
OGRE从不使用返回值来指示错误.相反,如果发生错误,则抛出异常,这是封装问题详细信息的对象.使用OGRE的应用程序应该始终确保捕获异常,因此所有OGRE引擎函数都应该在try {} catch(Ogre :: Exception&e){}块中发生.
真?每个Ogre函数都可以抛出异常并包含在try/catch块中?目前,我们在main中使用try/catch来处理它,它将在退出之前显示带有异常描述的消息框.这对于调试来说有点尴尬,虽然你没有得到堆栈跟踪,只是抛出错误的函数 - 更重要的是我们的代码中调用Ogre函数的函数.如果它是Ogre代码中的断言,那么它将直接进入调试器中的代码,我将能够更容易地找出发生的事情 - 我不知道我是否遗漏了一些可以让我调试异常已经?
我现在开始在我们的代码中添加一些try/catch块,通常考虑是否重要,如果Ogre函数抛出异常.如果它会阻止一切正常工作,那么让主try/catch处理它并退出程序.如果它不是很重要,那么在函数调用之后捕获它并让程序继续.最近的一个例子是为应用于实体的材质构建顶点/片段程序参数的向量 - 如果材质没有任何参数,那么它将抛出异常,我抓住然后忽略它,因为它没有'我需要添加到我的参数列表中.这看起来像处理事情的合理方式吗?任何与Ogre合作的具体建议都非常感谢.
Mar*_*tos 19
您不需要将最后一次调用包装到Ogre中try { ... } catch.只要你能够有意义地处理异常,你就可以做到这一点.在某些情况下,这可能位于单个呼叫站点,或者它可能处于某种高级循环中.如果你不能在任何地方有意义地处理它,根本不要抓住它; 让调试器接管.
特别是,您不应该main()因为您引用的原因(至少在开发过程中没有,您应该在生产中)捕获异常.
小智 6
我不知道关于Ogre的任何事情,我担心,但是异常处理的一般规则是你尽可能地从throw网站捕获异常,但是没有进一步.但是,只有在抛出异常的代码使用RAII来管理分配的资源时,才有可能实现这一点.如果代码使用动态分配到普通指针或其他形式的手动资源管理,那么您需要在调用站点使用try-blocks.如果是这种情况,我会说使用例外是一个坏主意.
您似乎不知道如何调试异常.或
要么
Ogre::Exception
构造函数中设置一个断点,当它试图抛出一个断点时,你将打破一个调用堆栈,其中下一个级别是throw站点.