返回码的设计
来源:互联网 发布:网络乌托邦谁提出的 编辑:程序博客网 时间:2024/05/14 23:15
在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的返回类型,这时返回码就无法使用了。
我重新尝试在返回码中添加错误发生位置的信息,如行号。但却没能指出错误类型,以致于只知道错误在哪里发生了,却不知道发生了什么。在我们定位和分析错误时,我们需要知道几类信息:1、触发错误发生的信号,比如返回值为负数,或者是空指针,正如c库中的处理方法;2、发生错误的类型,比如是文件不存在,还是内存不足,如errno所做的那样;3、错误发生的位置,究竟在哪个文件,以及是哪一行发生了错误;4、错误发生时的上下文环境,究竟是输入哪个值导致了错误或者异常的发生,这对我们分析定位错误是很重要的。
第1类比较简单,负值或者空值等非希望值都是可以用的。第2类稍微复杂点,许多POSIX标准错误,但应用级别的错误类型还是需要自己定义的。第3类可以通过宏__LINE__来获取,当然还有__FILE__,__FUNC__,__TIME__,__DATE__等宏可以使用。第4类就更加复杂了,不然很难统一格式,而且进行记录,我们一般通过日志发生,自行记录值。这个问题比较复杂,但也有一些可供借鉴的方案和工具,比如core dump。coredump文件在系统崩溃时,将当时的堆栈信息记录下来,但是这种方案只为灾难发生之后提供帮助,而无法为灾难发生之前提供帮助。而且很多业务级别的错误并不会引起系统的崩溃。
我们设计返回码时,主要还是考虑错误定位和错误类型2类型。我们首先在为每个c文件指定一个唯一的编码做为宏,于是我们将这个宏和行号组合起来,就可以定位错误发生的位置。错误类型可以放在这里,也可以作为一种新的errno。个人感觉都是可以接受的。
但是有个问题必须注意,有些函数是没有返回值的,或者是指针等其他非int的返回类型,这时返回码就无法使用了。
- 返回码的设计
- C++中函数返回值的设计
- 淘宝返回顶部组件goTop的设计
- Result dubbo接口返回类型的设计
- 函数返回值及错误码设计
- 返回码的含义
- 关于函数返回值的设计的一些思考
- 返回字符串的函数设计——几种方法
- 一种接口统一返回值的设计方法
- Java 返回数组或集合的方法设计
- 后端接口返回数据及编码的格式设计
- 接口返回值设计
- pyton设计一个函数,让返回值的调用来回切换,调用一次,返回1,下次调用返回0
- 【Java设计模式】状态模式处理返回码
- H5 应用返回按钮的js代码设计,设计思想模仿stack
- SMTP协议的返回码
- http返回码的含义
- 常见的HTTP返回码
- IEEE与通信协议的定义。
- 关于Hibernate组合查询返回对象显示
- phpMyAdmin安装图解教程
- 在C#中获取如PHP函数time()一样的时间戳
- Struts工作流程的学习笔记
- 返回码的设计
- c++ primer 第4版 习题
- 使用vb6解析word当中的visio对象
- 女友升级为老婆的时候发生的bug
- 面试的时候爱问的两道题
- Dr.com软件账号及密码的获取
- ajax 使用
- 缺省参数的virtual继承方式
- C#一个完整的执行ping命令的.cs文件,可编译成.dll文件用