程序错误类型及其处理

程序在设计调试甚至运行都难免出现错误,我们要做的是检测错误。

程序库错误

指的是程序库实现错误,当然,程序库的提供者在程序库发布之前,肯定想尽可能多地检测和纠正错误,但是任何比较大的程序库在发布的时候,都是肯定会包含错误的。

用户错误

主要是用户操作不当,指如何使用程序库方面的错误

系统错误

指用户程序和该程序所运行的系统之间发生交互时所引发的错误。这种错误部分是系统的责任,部分是用户的责任。

错误检测

一般会额外的注入检测代码,使得程序的稳定性得到提高,我们称为不变性检测,例如
char* p=某数组;
int i;
//…….经过某些操作
if(i<0 || i >=strlen(p))
{
//不变性不满足条件,失败!
//执行错误异常处理方案
}
char c = p[i];
为了检测错误,会额外的增加测试代码,时间复杂度从原来的常数级上升为现在的与数组长度线性相关,也就是说,错误检测通常和运行时间相互制约。

函数前提条件检测
可以简洁的说就是对函数的传入参数的有效性安全性检测!这一点对于函数设计很重要,因为要是传入不合理的参数,从源头制止给程序就会造成天大的错误。
表示不变性
指的是这个类的特性对于这个类的任何合法和或者合理的对象,这个特性总是能成立。

资源限制错误

1、堆栈溢出
注意是否有递归或者死循环引起的内存分配不足
2、用完空闲存储空间
健壮的解决方案:
(1)尝试分配更小的空间,不断的减半申请空间,直到申请成功
(2)删除储存区的某些东西,然后继续尝试分配
3、文件系统限制
用户机器有个文件系统,而且文件系统已经用完了所有的空间,那么任何希望增加文件的操作都将失败。

错误处理

程序库应该具有几种不同变量:
开发变量:用于开发和调试程序库本身;
调试变量:用于开发和调试用户代码;
优化变量:用于获得高效的执行效率。
(1)当检测到错误的时候,程序可以根据检测到的错误类型进行纠正错误。
(2)程序退出或者中止,虽然是最安全的做法,但是很多用户无法接受这种做法,因此C++的很多程序库永远不会退出或者中止程序
(3)抛出异常,优雅的处理方式。抛出异常也存在几点不足之处:并不是所有的C++编译器都支持如上面代码的异常处理机制,任何抛出异常的程序库将不再具有系统移植性,某些系统根本不存在支持异常处理的C++实现。而且很多编译器支持异常处理就会产生很多又大又慢的代码(异常处理需要额外的开销)
(4)异常处理被添加到C++之前,一个处理错误普遍的方法就是返回错误值。但也存在不足,不是所有函数都可以很容易的返回bool标记,第二个缺点就是用户可能未能检查这些错误值,程序开发者很容易忘记错误的检测。
(5)把一些无效数据解释为有效数据

异常安全性

C++异常处理的同时,可重用代码的编写者必须确定他们的代码是异常安全的,即使抛出异常的时候,他们的代码仍然可以正常运行,一旦异常抛出,堆栈是一直展开的,直到找到了异常的处理语句。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值