专栏首页编程修养C 语言程序的出错处理

C 语言程序的出错处理

C 语言程序的错误处理是需要程序员自己来解决的,而面向对象类语言如Java、C++、Python都是用异常机制来处理错误。

1. 常见的几种出错处理方式

如果返回值是 int 类型,并且返回的数据是非负数,一般使用 -1 代表出错,然后非负数代表正确的返回值。

如果返回值是 int 类型,但返回的数据有可能是负数,用指针接收返回数据,也就是将其中一个参数作为输出返回,用返回值 0 代表成功,返回 -1 代表出错。

如果返回值是指针,一般用 NULL 代表出错,非空代表正确。

如果不需要考虑错误处理,返回值用 void 即可。简单总结这几种情况,以上几种情况属于一般情况,当然也可能会有特列。

2. 设计函数的错误处理

打印传入的字符串 对应上述第 4 种情况,不需要返回值,一般不会出错,不需要考虑错误处理。

判断传入的字符串是否正确 判断传入的字符串是否是 error,如果是返回 ok,不是的话报错。对应上述第 3 种情况,如果不是返回 NULL。

返回 1-10 随机数 返回 1-10 随机数,如果随机数是 5,返回 -1 代表出错,若不是则返回 1-10 的随机数。

比较两个整数的大小 比较两个整数的大小,返回最大值,如果相等则报错。对应上述第 2 种情况,返回值可能是负数,不能直接返回 -1 来表示错误,需要增加指针参数来接收最大值的返回。

当然文中举例都非常简单,主要是想说明 C 语言程序中我们要关注错误的处理,这样有助于对程序的错误的快速排查。当然错误的时候不止可以返回 -1,如果系统比较复杂,可以设置多种错误码来区分程序中的各类错误,最好每个错误码都对应具体的错误原因。

3. 错误处理函数

C语言中,系统预先设定了一些错误,每种错误都由错误编号和错误信息组成。每个错误编号对应一种错误信息。

errno 外部全局变量,提供了错误编号,需要先出错,再用errno,函数出错会改变 errno 的值,但成功不会改值,也不会清零。所以它不能用于判断是否出错,errno 直接拿来使用即可,不过程序中需要加头文件 error.h。

strerror 函数通过错误编号得到错误信息,完成从错误编号到错误信息的转换,与 errno 没有直接的关系,是否产生错误都可以使用它。

printf("%s\n", strerror(errno);

perror 函数打印错误信息并自动换行,这个函数经常使用,参数是附加的信息,能更好的帮助程序员定位错误。

perror("open file error: ");
// 前提是打开文件出错

perror 函数是找 errno,打印 errno 对应的错误信息,先发生错误而后才能使用。errno 针对大多数函数有效,但也有一些函数不能使用 errno 作为错误记录,比如线程函数,因为线程出错会将之前的错误覆盖,导致不能够准确判断出具体错误。

本文分享自微信公众号 - 编程修养(chopin11vip),作者:「肖邦」

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C语言被忽视的一些小东西!C语言基础教程之错误处理

    C 语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或...

    诸葛青云
  • C语言中的预处理

    1、 宏定义 预处理命令可以改变程序设计环境,提高编程效率,它们并不是 C 语言本身的组成部分,不能直接对 它们进行编译,必须在对程序进行编译之前,先对程序中...

    编程范 源代码公司
  • C语言中的字符处理

    C语言中,提供的字符为 char,通常情况下,char 为 unsigned char,即无符号字符,表示单个字符,对于多个字符(字符串),C没有提供相应的类型...

    鲁郭大侠
  • C语言中的数据处理

    数组又分为一维数组、二维数组、多维数组,实际上,一维数组足够,其他维数组只是为了方便逻辑上运算,从数据的存储上基本 同一维数组。

    鲁郭大侠
  • 最容易出错的C语言指针

      C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以

    用户6754675
  • 最容易出错的C语言指针

    C语言指针说难不难但是说容易又是最容易出错的地方,因此不管是你要做什么只要用到C指针你就跳不过,今天咱们就以

    用户6754675
  • 另一种 C++ 程序错误处理方式

    C++ 是一个很灵活的语言,这把双刃剑一方面使得 C++ 有很强大的表达能力,但也使得其编程风格相当混乱,就连错误处理到底是使用错误码还是异常都常常争论不休。例...

    zhiruili
  • C语言中的字符串处理

    •字符串字面量(字符串常量,在C标准中称为,字符串字面量)如何存储字符串字面量  从本质上而言,C/C++ ...

    Java架构师必看
  • C语言中处理结构体的原理

    汇编中有几种寻址方式,分别是直接寻址:(ds:[idata])、寄存器间接寻址(ds:[bx])、寄存器相对寻址(ds:[bx + idata]、ds:[bx ...

    Masimaro
  • C语言(顶级黑客的c程序)

    作为世界最牛逼黑客之一,Linus Torvalds的特立独行就跟他的软件Linux一样受人瞩目,那你想知道Linux的创始人Linus Torvalds是怎么...

    用户2617681
  • 2.1 C语言程序的灵魂

    广义地说:为解决一个问题而采取的方法和步骤,就称为“算法”。计算机算法可以分为两大类:数值运算算法和非数值运算算法

    小林C语言
  • 10.5 C语言文件读写的出错检测

    ferror(fp),如果ferror返回值为0(假),表示为出错;如果返回一个非零值,表示出错。

    小林C语言
  • 1. C语言的第一个程序

    (。・∀・)ノ゙嗨!大家好,我是呆博~很开心可以在这里给大家分享我的 C 语言学习笔记~

    谭庆波
  • 自然语言处理(NLP)的一般处理流程!

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

    mantch
  • c语言中函数参数处理顺序-从右向左

    c语言中函数参数处理顺序-从右向左      下面我们来看2个案例,分析下c语言中函数参数处理顺序。      第一个: #include "stdio....

    _gongluck
  • 智能合约语言 Solidity 教程系列9 - 错误处理

    这是Solidity教程系列文章第9篇介绍Solidity 错误处理。 Solidity系列完整的文章列表,可阅读原文,查看分类-Solidity。

    Tiny熊
  • C语言程序员的爱情故事

    你是不是还在为如何写c代码感到困惑,当你看到它后你就还会这样吗?学习c语言又何尝不是一部曲折的爱情故事,但你刚认识她的时候,你好奇过迷茫过,但是你开始有点了解她...

    程序员互动联盟
  • 10个经典的C语言小程序

    来源:codeceo 今天给大家分享10个比较基础的C语言的小程序,希望给C语言初学者带来一定帮助。 1、题目:有1、2、3、4个数字,能组成多少个互不相同且...

    编程范 源代码公司
  • 1.3 运行C语言程序的步骤

    通过键盘向计算机输入程序,如发现有错误,要及时改正。最后将此源程序以文件形式存放在自己指定的文件夹内,文件用.c作为后缀。

    小林C语言

扫码关注云+社区

领取腾讯云代金券