Vico Bill< 刘 利 波 > 的个人网站

记录关于学习、工作中的技术点滴

C,C++,Rust,Ruby爱好者;热衷于游戏开发、任务自动化与跨平台;沉迷于游戏引擎与图形表现;深信'简单、多元'哲学的力量。


访问主页

游戏开发-异常处理

异常处理在编程中,其作用不太明显。通常在 C++游戏编程中,不推荐使用异常。异常是在发生错误时,对错误进行处理的方式。在 C 语言中,错误的处理相对来说很直接:通过执行之后,立即进行判断,来进行错误处理。这样的错误处理方式,造成的结果是代码冗余,充斥着错误处理逻辑代码:大部分都是在进行错误判别处理。因此为了避免满篇 if(error)的方式,让函数有多个出口点,有人使用 goto 进行集中处理错误,保持单一出口。

C++为此进行了改进,改为throw+try..catch,try 内块进行正常逻辑处理,当出现错误时,使用 catch 捕获错误,进行集中处理。这种方式是if(error) goto ..的变种,但比之更加简洁,正常处理的逻辑代码中,不需再充斥if(error)这样的代码,集中注意力于逻辑代码即可。对于callee函数,会自行判别自己的出错时机,当出错时,需要显式throw抛出异常。如果callee不抛出异常,则在callercatch时,是捕获不到异常的。但对于 C++而言,主要是编写高性能代码,特别是在游戏中,异常的实现方式不仅占用内存,而且因为是集中处理异常,如果需要对错误进行细致判断,则需要大量的不同exception,这也会造成低效率错误处理。同时,还需再考虑一件事:如果catch处理块中,再次抛出了异常,该当如何?所以在游戏开发中,往往不建议使用异常处理,而采用 C 语言的错误处理方式。

Java、C#对 C++更升一级,采用throw+try..catch..finally进行错误挽救处理,在常规 C++的错误处理之后,在catch处理块中,有可能再次发生异常,那么再发生异常时可使用finally处理块,来进行清理,保证对错误进行挽救。在 ruby 中,实现的关键字为:raise+rescue..ensure..retry

在 go 语言中,实现异常类似于 C 语言处理机制,但也稍微实现了异常处理,使用panic() + recover()函数方式。panic抛出异常,recover捕获异常。其方式可理解为 C++throw + catch

最近的文章

游戏开发-面向对象

面向对象是如今大多数代码基的基本构建方式。常规了解的面向对象包括封装、继承、多态。但今天,重新审视一下这三个特征。封装,之前往往说的是把数据和方法集中在一起,以访问限定符,限定数据和方法的外部访问权限。这没有错,但不根本。封装,应该是一个对象,自己管理自己的状态,而不应由别人管理。更严格点,对象自己保管的数据,归自己所有,其他外部无权改变其内部任意数据。这是自我管理的一种方式,保证一个对象是完整独立的黑盒,自我运行,然后给出对应的结论。外部不得依赖、也不应依赖使用的某对象的状态。在使用对象...…

继续阅读
更早的文章

笔记集锦-XCode知识汇总

XCodeunity 导出 ios 项目所需做的几个操作: 在 unity 的 Player Settings 中设置包名(Builde Identifier) 支持的脚本兼容特性为:.Net Standard 2.0 导入 Google Admob:所含的 Framework 或者使用 pod install导入第三方 Framework 之后,无法引入头文件:原因是无法找到头文件目录。 选择 build setting ,将 Framework 查找目录和头文件查找目录都加入(...…

继续阅读