已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
错误处理 目标 了解错误检查和错误处理的方法,从而提高编码的质量 目录 概述 错误检查 错误处理 GOTO GOTO GOTO 概述 错误的分类 不应该发生的错误 “应该发生”的错误 错误处理的几个方面 错误检查 发生异常错误时的处理 返回错误 错误处理的原则 输入垃圾,不能输出垃圾 错误检查 断言 检查输入参数 检查内部调用函数的返回值 错误检查与性能的平衡 GOTO GOTO GOTO GOTO BACK 错误检查 断言( ASSERT) 用于检查 “不应该发生的错误” 。 仅在 Debug版本起作用。 如果程序在 assert处终止了,并不是说含有该 assert的函数有错误,而是调用者出了差错, assert可以帮助我们找到发生错误的原因。 对于内部使用的函数,通常可以用断言,而对于提供给外部使用的函数,最好使用错误处理。 错误检查 断言( ASSERT) 一个例子 void *memcpy(void *pvTo, const void *pvFrom, size_t size) /*使用断言 */ assert(pvTo != NULL) & (pvFrom != NULL); byte *pbTo = (byte *) pvTo;/防止改变 pvTo的地址 byte *pbFrom = (byte *) pvFrom;/防止改变pvFrom的地址 */ while(size - 0 ) *pbTo + = *pbFrom + ; return pvTo; 错误检查 断言( ASSERT) 使用 assert时需要注意: 在编写函数时,要进行反复的考查,并且自问:“ 我打算做哪些假定? ” 一旦确定了的假定,就要使用断言对假定进行检查 assert不应该产主其他的副作用 ,因为 assert在release版是不执行的 Assert(a = b);/a=b在 release版不执行,错误 BACK 错误检查 检查输入参数 检查输入的内核对象 Handle是否有效,如线程handle、 event handle、文件 handle等 if( INVALID_HANDLE = inputHandle) 检查指针是否为 NULL if( NULL = inputPtr) 检查参数的取值范围是否符合对它的限制,对数组下标和偏移量尤其要检查,因为一个不合法的数组小标和偏移量会导致非法的内存访问 If( 0=maxSize) If( 0 31 ) 错误检查 检查输入参数 int noteL03_FAC_MakeDetail(MarkID_t *pstMarkID, void *pResult) do if( (NULL = pResult)|(NULL = pstMarkID) ) break; while(false); int noteL99_GetFileNameAndCateInfo(int index, , INNOTE_CateInfo_t *pstCateInfo) do if( index = INNOTE_DB_FILE_MAX ) break; *pstCateInfo = stNoteManageInfo.stCateInfoindex; while(false); BACK 错误检查 检查函数返回值 内核对象操作 fileHdl = noteL99_FileOpen(fName, O_BINARY|O_RDONLY, S_OREAD); if( fileHdl 0 ) break; 内存操作 buffHdl = noteL99_AssignMemory( buffSize ); if( buffHdl 0 ) break; pBuff = noteL99_LockMemory( buffHdl ); if( NULL = pBuff ) break; 一般函数的返回值 对所有函数的返回值进行判断,除非该函数没有返回值 BACK 错误检查与性能的平衡 过多的错误检查会影响性能 为了减少调用者的负担,如果函数任何情况下都不会出错,就不要有返回值 要避免重复的,无效的错误检查 对于“不应该发生”的错误,使用断言在开发阶段发现错误,发布以后就不进行错误检查了 BACK 错误处理 常用错误处理的方式 返回错误信息的几种方式 错误处理的实践 GOTO GOTO GOTO 常用错误处理的方式 把错误校正,并输出正确的结果 函数的容错性很好,但是会隐藏调用者的错误 大部分情况下,因为错误是不能校正的,所以不能这样处理 什么都不输出,返回成功信息 函数的容错性较好,但是会给调用者带来麻烦 不建议使用 什么也不输出,“返回”错误信息 建议使用 结束程序的运行 除非发生了极其严重的错误,否则不要这样做 返回错误信息的方式 通过函数返回值返回错误代码 更新某个公共的状态 通过 event、 message等发出错误的通知 输出打印信息 Error Log 上面几种的混合 注意:函数采用什么处理方式要在系统范围内或模块范围内统一规定,开发者在设计和编写函数的时候一定要弄清楚系统和模块的错误处理方式,并按照要求进行错误处理 返回错误信息 返回值 返回值的方式 返回值 定义不同的返回值以标识错误原因 返回值 + GetLastError 返回值只说明发生了错误 具体的错误原因通过 GetLastError()获得 这是 Windows系统处理错误的方法 错误代码的定义 足够的 必要的 注意:尽量使用系统和模块统一定义的错误代码。除非万不得已,不要自己单独定义。 返回错误信息 返回值 错误代码的定义实例 COM S_OK E_FAIL E_NOTIMPL E_INVALIDARG System Errors ERROR_SUCCESS ERROR_FILE_NOT_FOUND ERROR_TOO_MANY_OPEN_FILES ERROR_ACCESS_DENIED 返回错误信息 打印信息 输出打印信息实例 #if defined(DEVELOP_PHASE_DEBUG) #define DEBUGprintf(Argument_) printf_(%10s:%4d,_FILE_,_LINE_); REGULARprintf(Argument_); #else #define DEBUGprintf(Argument_) #endif 只能在 Debug版使用 注意:为了共同调试的方便,打印信息的格式最好在系统一级有统一的定义。开发者在函数中输出的打印信息必须符合系统的定义 返回错误信息 Error log Error Log 在 Release版, Error Log是唯一获得出错信息的途径 Error Log的信息 根据 Error Log信息必须可以迅速确定出问题的位置 从 Error Log中必须尽可能多的包含有意义的信息 返回错误信息 Error log Error Log void Inspect_writeErrorRecord( uint ErrorKind, uint ModuleID, uint Parameter1, uint Parameter2, uint Parameter3, uint Parameter4); BACK 错误处理的实践 现场恢复 函数因发生错误而 return时,一定要 “恢复现场”,即在return前让系统尽可能恢复到进入函数时的样子 如果申请了资源, return前要回收 释放申请的内存,关闭在函数内打开或创建的内核对象等 如果修改了输出参数,要把该参数恢复原来的值或设成其他合理的值(输入参数是不允许修改的) 如果修改了全局变量,或对文件进行了写操作,要将全局变量和文件恢复成进入函数时的样子 注意:如果不能完全恢复现场,至少要将资源正确回收 错误处理的实践 现场恢复 int sample() fileHdl = noteL99_FileOpen(); if( fileHdl 0 ) return FAILURE; buffHdl = noteL99_AssignMemory( ); if( buffHdl 0 ) return FAILURE; pBuff = noteL99_LockMemory( buffHdl ); if( NULL = pBuff ) noteL99_ReleaseMemory( buffHdl ); return FAILURE; return SUCCESS; 错误处理的实践 函数结构 前面例子的问题 发现错误就 return 每次 return都要回收资源,很麻烦 容易出错 容易遗漏 错误处理的实践 函数结构 修正方式一: goto 可以集中回收资源 不容易控制,一般项目都不允许用 goto 错误处理的实践 函数结构 修正方式二: do-while 可以集中回收资源 安全 错误处理的实践 异常 void AFunctionMayMeetSomeError() / 错误发生了 throw exception(meet
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年云计算数据中心建设与运营合作协议
- 2024年原料供应蜂蜜长期合同
- 2024年企业合并协议(含资产清单)
- 2024年专业音响设备买卖合同
- 外墙涂料施工安全防护方案
- 特防特护期间旅游行业稳定方案
- 梅州市公共交通提升方案
- 2024电梯楼宇电视广告合同
- 铝合金格栅施工现场管理方案
- 电气自动化领域创新创业人才培养方案
- 设备操作三好、四会、四要求、五原则和三不放过
- 邮轮面试英语PPT完整全套教学课件
- 提高工作效率有技巧(一)课件
- 完整版PCBA车间工艺流程及管控课件
- 荥阳市离婚协议书珍藏版
- 1+X证书无人机练习题库含答案
- 耳廓畸形的诊断与治疗
- SPSS期末统计分析报告
- 液化气站反恐防暴演练方案
- 2023关爱残疾人关爱残疾日帮残助残知识讲座
- 2016新编过盈量与装配力计算公式
评论
0/150
提交评论