首页 > 编程语言 >C语言编程—错误处理

C语言编程—错误处理

时间:2023-06-10 23:32:38浏览次数:35  
标签:错误 int errno 编程 C语言 stderr 错误处理 include quotient

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 <stdio.h>
#include <errno.h>
#include <string.h>
 
extern int 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);
   }
   return 0;
}

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

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

被零除的错误

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

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

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
   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 <stdio.h>
#include <stdlib.h>
 
main()
{
   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

标签:错误,int,errno,编程,C语言,stderr,错误处理,include,quotient
From: https://blog.51cto.com/u_15641375/6456188

相关文章

  • 编程学习感觉困难怎么办?
    当你感觉编程学习困难时,以下是一些可以帮助你的建议:保持积极心态:编程是一项复杂的技能,学习过程中可能会遇到挑战。重要的是保持积极的心态,相信自己能够克服困难并取得进步。分解问题:有时候一个看似复杂的编程问题可以被分解为更小、更容易解决的子问题。尝试将问题分解......
  • JavaScript学习笔记:客户端编程之异常处理
    未被捕获的异常在程序中,往往会出现异常。虽然主动捕获这些异常是保证程序健壮的必要做法,但是难免会漏掉一些。对于未被捕获的异常,浏览器会在控制台显示一条错误信息,该信息包含异常信息和其在代码中出现的位置。window.onerrorWindow对象有一个onerror属性,将其指定为一个函数,可......
  • 实验7 文件应用编程
    task1#include<stdio.h>#defineN7#defineM80typedefstruct{charname[M];//书名charauthor[M];//作者}BOOK;intmain(){BOOKx[N]={{"《雕塑家》","斯科特·麦克劳德"},{"《灯塔》","克里斯多夫·夏布特&......
  • Golang的错误处理
    Golang的错误处理引言在软件开发中,错误处理是一个非常重要的方面。它涉及到识别、捕获和处理在程序执行期间可能发生的错误。在Golang中,错误处理是一个值得关注的主题,因为它为开发人员提供了一种优雅且高效的方式来处理错误情况。本文将深入探讨Golang的错误处理机制,并为您提供一......
  • C语言宏(macro)小技巧
    目录字符串化运算符(stringizingoperator)记号粘贴运算符(token-pastingoperator)二选一选择器宏(mux)字符串化运算符(stringizingoperator)运算符#在宏中会将实参直接转化为字符串literal,也就是字符串常量,举个简单的例子:#definearg2str(p)#pputs(arg2str(666));//宏展开后变......
  • 实验六 turtle绘图与python库应用编程体验
    task1_1实验源码:fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • C语言-字符串
    简介C语言没有单独的字符串类型,字符串被当作字符数组,即char类型的数组。比如,字符串“Hello”是当作数组{'H','e','l','l','o'}处理的。编译器会给数组分配一段连续内存,所有字符储存在相邻的内存单元之中。在字符串结尾,C语言会自动添加一个全是二进制0的字节,写作\0字符,表示字......
  • 网站加速,AdapterMan 是基于 Workerman 的高性能 PHP 异步网络编程框架,可以用于加速任
    AdapterMan是基于Workerman的高性能PHP异步网络编程框架,可以用于加速任意项目。下面是使用AdapterMan进行加速的详细步骤:1.安装AdapterMan:composerrequireadapterman/adapterman 2.创建一个PHP文件,例如`index.php`,并编写以下代码:require_once__DIR__.......
  • Java编程技巧-定义集合常量、定义数组常量的最佳方式
    场景Java中定义集合常量的最佳方式在编码中,经常使用到各种集合常量,比如List(列表)常量、Set(集合)常量、Map(映射)常量等。普通方式一般这样写:publicstaticfinalList<Integer>CONST_VALUE_LIST=Arrays.asList(1,2,3);publicstaticfinalSet<Integer>CONST_VALUE......
  • Python概率编程库PyMC应用案例二则
    这是受国防科大刘万伟老师委托发的概率编程方面的内容,这方面我不懂,为了避免解释错了,我就直接把刘老师的PPT资料截图发了。代码执行结果为:0.236对于上面这个例子(均匀分布的情况),当然可以通过计算图条形区域面积所占的比例获得精确的概率。然而,当分布函数发生变化时(比如,取正态分布),计......