三种出错处理方式各自优缺点

这是数据结构习题册上的一题,网上已经有很多答案了。我希望能够写得全面点。


三种错误处理方式为:

(1)用exit语句终止执行并报告错误
(2)以函数的返回值区别正确返回和错误返回
(3)设置一个整型变量的函数参数以区别正确返回或某种错误返回


一 exit语句终止执行并报告错误

exit实际是上是一个系统调用(system call)。何谓系统调用,就是应用程序于操作系统之间的接口,封装了很多基本的操作,这些操作是被频繁使用且大部分需要直接与硬件打交道的。在多线程环境中,一个线程的exit,表示该线程终止运行,然后操作系统会回收分配给该线程的资源,如内存、文件和输出设备等。

所以,终止执行就是exit能够终止所在的进程或线程,并将程序控制权返还给操作系统。那么,它是怎么报告错误的呢?

exit语句实际上,可以携带参数,这叫做exit status,格式是exit(status)。例如,0表示正常退出,非0表示异常退出;用偶数表示正常退出,用奇数表示非正常退出;用不同范围的整数表示正常退出、警告和错误等信息。

我用过的一些语句:

exit(status); // 正常退出,C语言
System.exit(status); // Java
sys.exit(status); // Python
exit // DOS
exit() // Python命令行

这种错误处理方式,将直接导致当前进程或线程的终止。如果程序中只有一个进程或是线程, 那么程序就会终止。除非发生的错误严重影响到后面语句的执行,否则都应该做出相应的处理。这类错误例如文件打开失败、内存分配失败这类,不能通过程序自主校正的错误,因为文件打开失败,绝大多数情况都不是程序的问题,而这个错误将直接导致后继关于文件的读写的失败,必须退出,让程序编写者来纠正错误。对于内存分配失败,这个我还没遇到过,但是内存对于程序运行的重要性是非常重要的,没有充足的内存,就不能有效地进行数据结构的操作等,除了终止程序别无他法。

二 以函数的返回值区别正确返回和错误返回

我用的数据结构这本书中,部分采用了这样的方式。

关于状态码的定义如下:

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int bool;

一些函数,例如:

Status InsIdxList(IdxListType &idxlist, int bno);
Status InOrderTraverse(BiThrTree T, Status(*visit)(TElemType e));

运用这种方式进行错误处理,只需要根据返回值就能够知道出现错误的具体类型。但是大范围采用这种方式处理函数的返回值,会导致函数的参数变多。例如,一个本可以通过函数返回值得到的值,却把它作为参数传递给函数,对于C语言中的传指针的话,无形中增加了错误的概率。因此,适当选择一些函数或是方法,用它们的返回值作为错误处理的参考是理智的。

三 设置一个整型变量的函数参数以区别正确返回或某种错误返回

这种方式克服了用返回值区分正确返回还是错误返回的缺点,把函数返回值这个有利于程序简洁的地方留了出来,是一个很聪明的做法。而且,整型变量意味它的范围比较广,可以对类型繁多的错误进行有效地反映。缺点呢,因为我没遇到过,先放着。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值