0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言errno、perror()和strerror()

电子工程师 来源:未知 作者:李倩 2018-11-12 15:01 次阅读

C语言不提供对错误处理的直接支持,但是作为一种系统编程语言,它以返回值的形式允许您访问底层数据。在发生错误时,大多数的 C 或 UNIX 函数调用返回 1 或 NULL,同时会设置一个错误代码errno,该错误代码是全局变量,表示在函数调用期间发生了错误。您可以在 errno.h 头文件中找到各种各样的错误代码。

所以,C 程序员可以通过检查返回值,然后根据返回值决定采取哪种适当的动作。开发人员应该在程序初始化时,把 errno 设置为 0,这是一种良好的编程习惯。0 值表示程序中没有错误。

errno、perror() 和 strerror()

C 语言提供了perror()和strerror()函数来显示与errno相关的文本消息。

perror()函数显示您传给它的字符串,后跟一个冒号、一个空格和当前 errno 值的文本表示形式。

strerror()函数,返回一个指针,指针指向当前 errno 值的文本表示形式。

让我们来模拟一种错误情况,尝试打开一个不存在的文件。您可以使用多种方式来输出错误消息,在这里我们使用函数来演示用法。另外有一点需要注意,您应该使用stderr文件流来输出所有的错误。

#include#include#includeexternint errno ;int main (){ FILE * pf; int errnum; pf = fopen ("unexist.txt","rb"); if(pf == NULL) { errnum = errno; fprintf(stderr,"错误号: %d\n", errno); perror("通过 perror 输出错误"); fprintf(stderr,"打开文件错误: %s\n", strerror( errnum )); } else { fclose (pf); } return0;}

当上面的代码被编译和执行时,它会产生下列结果:

错误号:2通过 perror 输出错误:No such file or directory打开文件错误:No such file or directory

被零除的错误

在进行除法运算时,如果不检查除数是否为零,则会导致一个运行时错误。

为了避免这种情况发生,下面的代码在进行除法运算前会先检查除数是否为零:

#include#includemain(){ int dividend =20; int divisor =0; int quotient; if( divisor ==0){ fprintf(stderr,"除数为 0 退出运行...\n"); exit(-1); } quotient = dividend / divisor; fprintf(stderr,"quotient 变量的值为 : %d\n", quotient ); exit(0);}

当上面的代码被编译和执行时,它会产生下列结果:

除数为0退出运行...

程序退出状态

通常情况下,程序成功执行完一个操作正常退出的时候会带有值 EXIT_SUCCESS。在这里,EXIT_SUCCESS 是宏,它被定义为 0。

如果程序中存在一种错误情况,当您退出程序时,会带有状态值 EXIT_FAILURE,被定义为 -1。所以,上面的程序可以写成:

#include#includemain(){ int dividend =20; int divisor =5; int quotient; if( divisor ==0){ fprintf(stderr,"除数为 0 退出运行...\n"); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr,"quotient 变量的值为: %d\n", quotient ); exit(EXIT_SUCCESS);}

当上面的代码被编译和执行时,它会产生下列结果:

quotient 变量的值为:4

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33073
  • 函数
    +关注

    关注

    3

    文章

    3867

    浏览量

    61308

原文标题:C语言中的错误处理机制

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    移植LwIP+uCOS提示 errno没有定义怎么解决 ?

    请教下,移植 LwIP+uCOS,提示 errno 没有定义 ? 是哪里没有配置好哇 ???
    发表于 04-23 07:21

    关于linuxsocket非阻塞编程问题,server无法收到client的信息?

    ) {perror("malloc");exit (-1);}bzero(buffer,BUFFER+1);c_fd=socket(AF_INET,SOCK_STREAM,0);if(!c
    发表于 10-26 17:27

    server在非阻塞下收不到client的数据

    ) {perror("malloc");exit (-1);}bzero(buffer,BUFFER+1);c_fd=socket(AF_INET,SOCK_STREAM,0);if(!c
    发表于 10-26 17:37

    串口测试

    ;, strerror(errno)); exit(1);}static void Warning(const char *Msg){fprintf (stderr, "Warning: %s
    发表于 12-19 21:56

    mini2440串口测试程序中stdout和stderr不懂,求大侠讲解下。。。

    可写if (write(TtyFd, &Char, 1) < 0) {Error(strerror(errno));}if (OutputToStdout) { if (UseColor
    发表于 10-25 12:45

    【LOFT-Q试用】LOFT-Q 读取 G-Sensor 数据(2)

    , I2C_SLAVE, BMA250_ADDR ) < 0 ){ printf("err: ioctl error : %s\r\n", strerror(errno
    发表于 07-27 22:37

    树莓派系列教程11:I2C编程

    ;Error opening file: %s\n", strerror(errno));return 1; } if (ioctl(fd, I2C_SLAVE, I2C_ADDR)
    发表于 03-28 13:56

    C语言宏定义中#和##的作用

    ;%s",strerror(errno); // 调用方式,不需要定义ERR宏,接口会自动打印为字符串这个宏可以很方便地替换在项目中使用的正式日志接口,用来保持模块的独立性,便于模块的测试。
    发表于 08-23 18:22

    基于嵌入式Linux的网络通信系统(源代码+报告文档)

    ,errno message is '%s'\n",buf,errno,strerror(errno));break; } bzero(buf,MAXBUF+1); len=recv
    发表于 07-03 01:14

    input之上层

    )) {if(errno == EINTR)return 0;ALOGW("could not get event, %s\n", strerror(errno));return -1
    发表于 09-25 15:51

    berkeley_api到errno.h还是sys/errno.h?

    你好!没有检查这个问题是否是特定的,也影响了C32的整体。总之:在berkeley_api.c文件中,包含两个版本的errno.h。includeinclude嗯!两者都定义了EPREM的不同值
    发表于 09-24 10:35

    优秀的项目都使用最精简的设计

    ) pError("lock %s queueMutex failed, reason:%s", pSched->label, strerror(errno
    发表于 09-19 16:10

    STM32MP157A-DK1的A7和M4之间是如何实现数据交换的

    strerror(errno): "Invalid Argument"。这是代码:void *buff0_id;int fd;size_t size;int main(void
    发表于 12-14 07:35

    【HD-G2UL-EVM开发板体验】Modbus通讯之Modbus从机实现

    ;, modbus_strerror(errno));return 0; } //register: 15/16/17 mb_mapping = modbus_mapping_new_start_address
    发表于 01-16 17:12

    esp32-c3 wifi和mqtt实现重连方法有哪些?

    ;esp_transport_sock_errno);ESP_LOGI(TAG, "Last errno string (%s)", strerror(event->
    发表于 02-14 06:46