因此C编程不提供错误处理的直接支持,但作为一个系统编程语言,它为您提供了在较低的水平访问返回值的形式。大多数C或甚至是Unix函数调用返回-1或NULL的情况下,任何的错误,并设置错误代码errno设置是全局变量,并表示任何函数调用时发生了错误。可以在<error.h>头文件中定义的各种错误代码。
所以,C程序员可以检查返回值,并可以采取适当的动作取决于返回值。作为一个很好的做法,开发人员应该设置 errno 为0 在程序初始化时。0表示没有在程序没有错误。
errno, perror() 和 strerror()
C编程语言提供perror()和strerror()函数可以被用来显示与错误号相关联的文本消息。
-
perror()函数显示了传递给它的字符串,后跟一个冒号,一个空格,当前errno值的文字表述。
-
strerror()函数返回一个指向当前errno值的文字表述。
让我们试着来模拟错误情况,并尝试打开一个不存在的文件。在这里使用两种功能来显示的使用,但可以使用打印一个错误或多种方式。需要注意一点是,应该使用标准错误文件流输出的所有错误。
#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 ", errno); perror("Error printed by perror"); fprintf(stderr, "Error opening file: %s ", 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
除零错误
它是在一次除以任意数时,程序员不检查是否一个除数为零,最后它创建一个运行时错误的程序。
下面的代码修复此通过检查除数为0 - 除以零:
#include <stdio.h> #include <stdlib.h> main() { int dividend = 20; int divisor = 0; int quotient; if( divisor == 0){ fprintf(stderr, "Division by zero! Exiting... "); exit(-1); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d ", 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... "); exit(EXIT_FAILURE); } quotient = dividend / divisor; fprintf(stderr, "Value of quotient : %d ", quotient ); exit(EXIT_SUCCESS); }
让我们编译和运行上面的程序,这将产生以下结果:
Value of quotient : 4