返回码的设计

    在C语言中,返回码是很重要的值。和其他支持异常的语言,如C++不一样,C主要还是通过返回码来判断是否执行成功以及发生错误的原因。在POSIX规范中,定义了全局唯一的错误码,当错误发生时,errno指示出错误的原因,而返回码以-1或者NULL等畸形值来指示错误的发生。但是这同样有个问题无法解释,就是发生错误的确切位置。
    我重新尝试在返回码中添加错误发生位置的信息,如行号。但却没能指出错误类型,以致于只知道错误在哪里发生了,却不知道发生了什么。在我们定位和分析错误时,我们需要知道几类信息:1、触发错误发生的信号,比如返回值为负数,或者是空指针,正如c库中的处理方法;2、发生错误的类型,比如是文件不存在,还是内存不足,如errno所做的那样;3、错误发生的位置,究竟在哪个文件,以及是哪一行发生了错误;4、错误发生时的上下文环境,究竟是输入哪个值导致了错误或者异常的发生,这对我们分析定位错误是很重要的。
    第1类比较简单,负值或者空值等非希望值都是可以用的。第2类稍微复杂点,许多POSIX标准错误,但应用级别的错误类型还是需要自己定义的。第3类可以通过宏__LINE__来获取,当然还有__FILE__,__FUNC__,__TIME__,__DATE__等宏可以使用。第4类就更加复杂了,不然很难统一格式,而且进行记录,我们一般通过日志发生,自行记录值。这个问题比较复杂,但也有一些可供借鉴的方案和工具,比如core dump。coredump文件在系统崩溃时,将当时的堆栈信息记录下来,但是这种方案只为灾难发生之后提供帮助,而无法为灾难发生之前提供帮助。而且很多业务级别的错误并不会引起系统的崩溃。
    我们设计返回码时,主要还是考虑错误定位和错误类型2类型。我们首先在为每个c文件指定一个唯一的编码做为宏,于是我们将这个宏和行号组合起来,就可以定位错误发生的位置。错误类型可以放在这里,也可以作为一种新的errno。个人感觉都是可以接受的。
    但是有个问题必须注意,有些函数是没有返回值的,或者是指针等其他非int的返回类型,这时返回码就无法使用了。
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值