C语言 错误处理

  • 错误处理

    C语言不提供对错误处理的直接支持,但作为一种系统编程语言,它以返回值的形式提供了较低级别的访问。大多数C甚至Unix函数调用在出现任何错误时返回-1或NULL,并设置错误代码errno。它被设置为一个全局变量,并指示在任何函数调用期间发生的错误。您可以在error.h头文件中找到各种错误代码。因此,C程序员可以检查返回值,并根据返回值采取适当的操作。在初始化程序时将errno设置为0是一个很好的实践。值0表示程序中没有错误。
  • errno,perror()和strerror()

    C编程语言提供了perror()strerror()函数,可用于显示与errno关联的文本消息。
    perror()函数显示了传递给它的字符串,后面跟着冒号,一个空格,那么当前错误值的文本表示。
    strerro()函数,该函数返回一个指针,当前错误值的文本表示。
    让我们尝试模拟一个错误情况,并尝试打开一个不存在的文件。在这里,我同时使用这两个函数来显示用法,但是您可以使用一种或多种方式打印错误。要注意的第二点是您应该使用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, "Value of errno: %d\n", errno);
          perror("Error printed by perror");
          fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
       } else {
       
          fclose (pf);
       }
       
       return 0;
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Value of errno: 2
    Error printed by perror: No such file or directory
    Error opening file: No such file or directory
    
  • 除以零错误

    一个普遍的问题是,在除以任何数字时,程序员不会检查除数是否为零,最终会产生运行时错误。下面的代码通过在除法之前检查除数是否为零来解决此问题-
    
    #include <stdio.h>
    #include <stdlib.h>
    
    main() {
    
       int dividend = 20;
       int divisor = 0;
       int quotient;
     
       if( divisor == 0){
          fprintf(stderr, "Division by zero! Exiting...\n");
          exit(-1);
       }
       
       quotient = dividend / divisor;
       fprintf(stderr, "Value of quotient : %d\n", quotient );
    
       exit(0);
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Division by zero! Exiting...
    
  • 程序退出状态

    通常的做法是,在成功操作后程序退出后,使用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, "Division by zero! Exiting...\n");
          exit(EXIT_FAILURE);
       }
            
       quotient = dividend / divisor;
       fprintf(stderr, "Value of quotient : %d\n", quotient );
    
       exit(EXIT_SUCCESS);
    }
    
    尝试一下
    编译并执行上述代码后,将产生以下结果-
    
    Value of quotient : 4