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

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

3天内不再提示

C语言中的错误处理机制解析

单片机与嵌入式 来源:单片机与嵌入式 2024-02-26 11:19 次阅读

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 
#include 

extern int errno ;

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

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

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

被零除的错误

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

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

#include 
#include 

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

  exit(0);
}

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

除数为 0 退出运行...

程序退出状态

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

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

#include 
#include 

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

  exit(EXIT_SUCCESS);
}

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

quotient 变量的值为 : 4



审核编辑:刘清

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

    关注

    180

    文章

    7530

    浏览量

    128652
  • 编程语言
    +关注

    关注

    9

    文章

    1878

    浏览量

    33108
  • 函数调用
    +关注

    关注

    0

    文章

    19

    浏览量

    2554

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

文章出处:【微信号:单片机与嵌入式,微信公众号:单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    嵌入式编程错误处理机制设计

    本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。文中涉及的代码运行环境如下。
    发表于 04-28 09:59 543次阅读
    嵌入式编程<b class='flag-5'>错误处理机制</b>设计

    嵌入式系统C语言编程中主要的错误处理方式

    本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。
    发表于 07-24 16:40 543次阅读
    嵌入式系统C<b class='flag-5'>语言</b>编程中主要的<b class='flag-5'>错误处理</b>方式

    Rust语言中错误处理机制

    可能的错误,实际运行中仍然可能出现各种各样的错误,比如文件不存在、网络连接失败等等。对于这些不可预测的错误,我们必须使用错误处理机制来进行处理
    的头像 发表于 09-19 14:54 777次阅读

    labviEW错误处理的问题

    为什么这个程序在启用自动错误处理C:\data.txt不存在的情况下,没有显示错误对话框啊?
    发表于 04-01 10:03

    C语言中断言如何去使用

    文章目录1 C语言中断言的使用1.1 处理方式1.2 原型定义1.3 示例代码1 C语言中断言的使用1.1
    发表于 07-14 08:15

    INtime RTOS内部的关键处理机制是什么

    INtime RTOS内部的关键处理机制是什么?INtime RTOS内部的关键处理机制有哪些相关的应用案例?
    发表于 09-29 06:28

    基于stm32串口环形缓冲队列处理机制是什么

    基于stm32串口环形缓冲队列处理机制是什么
    发表于 12-08 07:06

    AF错误处理

    想问一下关于AF的错误处理,例如我进行串口通讯,打开串口错误,但是我不想停止AF,想继续尝试连接要怎么做?
    发表于 02-03 15:44

    Cortex-M3的异常处理机制分析

    Cortex-M3的异常处理机制分析  详细阐述CortexM3异常的分类、优先级、进入和退出,以及在CortexM3异常处理机制中使用的新技术——迟到(late?arriving)和
    发表于 03-29 15:07 1809次阅读
    Cortex-M3的异常<b class='flag-5'>处理机制</b>分析

    LabVIEW中的错误处理

    如何合理使用 LabVIEW 中的自定义错误处理功能;对于可预见的错误,是否可以选择直 接忽略,或者前几次尝试忽略直到该特定错误出现很多次后才通知用户需要纠正该错误 了;是否可以对
    发表于 05-24 11:07 6次下载

    嵌入式系统C语言编程中的错误处理资料总结

    本文主要总结嵌入式系统C语言编程中,主要的错误处理方式。文中涉及的代码运行环境如下:
    发表于 11-28 10:39 1754次阅读

    Rust代码启发之返回值异常错误处理

    这样的代码,错误处理代码和业务逻辑交织在一起,也容易忽略处理错误。以及把返回值只用于错误返回,有点浪费的感觉。因为很多时候把计算结果作为返回值,更符合思考的逻辑。
    的头像 发表于 09-22 09:24 1654次阅读
    Rust代码启发之返回值异常<b class='flag-5'>错误处理</b>

    S32K1xx的ECC错误处理机制

    或阿尔法粒子)、电磁干扰、电噪声或电路短路等原因。在原理上ECC是在对用户开放的存储器之外的区域额外增加存储单元来存储ECC计算结果,所以通常不占用额外的RAM空间,当数据被读取时ECC会实时校验待读取数据的正确性,在检测到错误时及时进行自动纠正或者产生错误通知,进而产生
    的头像 发表于 03-16 09:10 4099次阅读

    西门子博图:错误处理机制概览

    可通过以下几种不同的错误处理机制进行参数跟踪或编程或访问错误
    的头像 发表于 11-25 11:35 1008次阅读
    西门子博图:<b class='flag-5'>错误处理机制</b>概览

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理机制,例如try-catch-finally等。
    的头像 发表于 02-28 14:25 239次阅读