我目前正在使用包括OGRE(图形),Bullet(物理)和OpenAL(声音)在内的各种中间件开发C++游戏引擎,而且我相当早在项目中。在这一点上,我正在设置我的错误处理机制。错误处理范例:混合异常和错误代码
我计划通过将引擎包含在DLL中并将导出的函数返回到主引擎对象的指针来向用户公开引擎。该对象将包含可以访问引擎的各种组件的方法 - 大多数对象将通过接口访问,以便用户可以从实际实现中隐藏。
我倾向于通过DLL链接使用错误代码为我的错误报告机制,而不是例外,因为
- 传递异常增加了错误报告的复杂性,迫使我出口的异常类,等等。 ,并且
- 错误代码通常更高效,因此它们在实时游戏引擎中很常见。
那么出现的唯一问题就是带构造函数的问题 - 它们不能返回错误代码。因此,我计划对所有方法使用错误代码,但在构造函数失败时抛出异常。由于我打算使用工厂方法模式来生成对象并将它们传递给用户代码,异常将由引擎在内部处理,并且用户在构造失败时只会获得空指针。我知道你平时应该不能混合异常和返回代码,但该方案不健全任何好转:
- 在构造函数中你不能做任何事情,使用某种类型的init()方法,但有去RAII。
- 你可以设置一个标志,并有一些isOk()或isInitialized()方法,但现在你已经介绍了一些僵尸状态的可能性,对象存在但未能初始化,你可能忘记检查确保它还活着。
我意识到两个系统的内在成本和收益,并认识到混合两者通常是一个坏主意。然而,由于构造函数不能有某种返回值,当构造函数失败并在其他地方使用错误代码时,是否会出现不合理的抛出异常?有没有人有更好的建议?
为什么要使用DLL?为什么不是静态库? – 2011-04-18 19:20:10
@unperson:灵活性,模块性,“推荐性”,它是一个由多个应用程序使用的库,等等......为什么不使用DLL? – rubenvb 2011-04-18 19:24:53
在构造函数中出现错误的Re标志:好的,错误代码同样容易被忽略。 – delnan 2011-04-18 19:26:07