GEA 3.3 捕捉及处理错误
程序员需要理解错误捕获以及处理错误情况
3.3.1 错误类型
两种基本错误情况:
- 用户错误:用户做了不正确的事情引发的错误
- 程序员错误:代码本身的BUG所引起的错误,若程序员不犯错问题可以避免
3.3.2 错误处理
在理想情况下所有的程序员错误都应该在产品发布前被修复,处理程序员错误的方法是中止并通知,处理用户错误的方法是通知并且继续。但是在实际情况中往往根据实际情况灵活决定处理方式以提高效率。
3.3.3 实现错误检测及处理
3.3.3.1 错误返回码
设计枚举类型函数,向上层返回一定值来表示错误类型
3.3.3.2 异常
错误返回码的问题是检测到错误的函数与可处理错误的函数完全无关。如果在堆栈顶部的函数遇到错误其下面的全部函数都需要逐一传送代码造成冗杂。
抛出异常 检测到错误的函数的情况下就可以把错误信息传给其他的代码,程序进行堆栈辗转开解,调用相应的try函数与catch中的代码逐个比对,找到匹配的就会执行catch的语句。在辗转开解寻找try的过程中会自动调用所有变量的析构函数。
析构函数:当一个类的对象离开作用域时,析构函数将被调用(系统自动调用)。析构函数的名字和类名一样,不过要在前面加上 ~ 。对一个类来说,只能允许一个析构函数,析构函数不能有参数,并且也没有返回值。析构函数的作用是完成一个清理工作,如释放从堆中分配的内存。
一个类中可以有多个构造函数,但析构函数只能有一个。对象被析构的顺序,与其建立时的顺序相反,即后构造的对象先析构。
运行负担:使用异常会造成调用帧变大因为要存储多出的信息。并且堆栈的辗转开解很慢。因此由此引擎中通常关闭异常。
3.3.3.3 断言
断言是一行检查表达式的代码表达式求值表达式求值为真则继续为假则直接中止程序打印消息。
断言通过#define来实现,游戏发行时可以去除断言来提高运行效能
断言实现 定义在宏中的一个if/else判断
#if ASSERTIONS_ENABLED#define debugBreak() asm(int 3;)#define ASSERT(expr)if(expr){}else{reportAssertionFailure(#expr,__FILE__,__LINE__);debugBreak();}
#else#define ASSERT(expr)
#endif
#define ASSERT(expr) if(!(expr)) debugBreak();
通常的ASSERT宏可以在所有生成中保留,第二种SLOW_ASSERT只在调试生成中有效
断言应该用来捕捉严重错误。
GEA 3.3 捕捉及处理错误相关推荐
- assert()断言函数,用于在调试过程中捕捉程序错误
断言函数,用于在调试过程中捕捉程序的错误. "断言"在语文中的意思是"断定"."十分肯定地说",在编程中是指对某种假设条件进行检测,如果条件 ...
- cocos2d-x 错误异常抛出捕获和崩溃拦截
Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...
- 报告软件测试错误的规范
报告软件测试错误的目的是为了保证修复错误的人员可以重复报告的错误,从而有利于分析错误产生的原因,定位错误,然后修正之.因此,报告软件测试错误的基本要求是准确.简洁.完整.规范.需要掌握的报告技术归纳如 ...
- javascript 错误与调试
1.JavaScript 错误 - throw.try 和 catch try 语句测试代码块的错误. catch 语句处理错误. throw 语句创建自定义错误. 1.1 JavaScript 错误 ...
- ***PHP中error_reporting()用法详解(含codeigniter框架中屏蔽错误提示的解决方案)
php中我们对错误的处理会常用到error_reporting函数了,大家可以看到最多的是error_reporting(E_ALL ^ E_NOTICE)了,这个到底什么意思呢,下面我来来看看. e ...
- 艾伟:【翻译】使用ASP.NET 2.0记录错误
原文:http://www.dotnetcurry.com/ShowArticle.aspx?ID=94&AspxAutoDetectCookieSupport=1 使用ASP.NET 2.0 ...
- python random.choice报错_如何解决mtrand.RandomState.choice中的内存错误...
我试图从1e5字符串中抽取1e7个项目,但是出现内存错误.从1e4字符串中抽取1e6项是很好的.我在64位机器上使用4GB RAM,并且不认为我应该在1e7达到任何内存限制.有任何想法吗? $pyth ...
- 捕捉到了异常继续循环_前端异常处理最佳实践
前端可以说是最贴近用户的一层,当产品不断的迭代完善,产品的用户体验会更加趋向于完美,然而前端异常却是很另人头疼的一个问题,我们应该怎么去对待这些异常呢? 一.为什么要处理异常? 异常是不可控的,会影响 ...
- 使用ASP.NET 2.0进行记录错误
在本文中,我们将通过一个简单的处理来记录在我们的网站中的错误和异常.我们会这样操作:每当遇到程序错误时,将使用者导航到一个单独的页面.同时,错误将被记录到服务器上的一个文本文件.每当错误发生时,我们将 ...
最新文章
- python模块--如何相互调用自己写的模块
- 关于linkedin的network的观察和自己的职业道路的追求
- 一文搞懂C语言文件操作
- Java版世界时钟示例
- open-falcon的插件机制
- PyTorch | torch.full()使用方法 | torch.full()如何使用? torch.full()例子说明 | 通过torch.full创建全相同的张量
- Scala 深入浅出实战经典 第91讲:Akka第一个案例动手实战架构设计
- Oracle磁带机扩容方案,IBM TS3500带库磁带机扩容方案.doc
- EXCEL VBA 操作图表
- 如何在64位win10中装个win98虚拟机
- 计算机中的文档地址怎么填写,电脑中我的文档属性中没有位置选项如何修改存储位置...
- coursera “the media could not be loaded either because the server or network falled...“解决办法
- JAVA程序把大写转换小写_Java程序将字符串转换为小写和大写。
- 数学系小仙女不写代码求“破圈”,一年把华为这个社区做火了
- 股市 | 股市中的随机事件
- 非常好看的二次元导航源码
- Codeforces Round #701 (Div. 2) 总结
- 我的世界java什么村民卖地图_1.11/1.11.2关于探险地图及制图师村民的一些机制介绍...
- 利用Python进行数据分析:数据规整(基于DataFrame)
- 基于VASP+phonopy+shengbte计算声子相干的热学性质