C 语言中的错误处理
C 语言不提供任何对错误处理的直接支持。但是 error.h 头文件中定义的一些方法和变量可以用来使用函数中的返回语句指出错误。在 C 语言中,函数在出现错误时返回-1
或NULL
值,全局变量errno设置有错误代码。所以返回值可以用来在编程时检查错误。
什么是 errno?
每当用 C 语言进行函数调用时,都会有一个名为errno
的变量与之关联。它是一个全局变量,可用于根据其值识别函数执行时遇到的错误类型。下面我们列出了错误号及其含义。
| errno value | 错误 | | one | 不允许操作 | | Two | 没有这样的文件或目录 | | three | 没有这样的过程 | | four | 中断的系统调用 | | five | 输入输出错误 | | six | 没有这样的设备或地址 | | seven | 参数列表太长 | | eight | Exec 格式错误 | | nine | 错误的文件编号 | | Ten | 没有子进程 | | Eleven | 再试 | | Twelve | 被遗忘 | | Thirteen | 权限被拒绝 |
C 语言使用以下函数来表示与 errno 相关的错误信息:
perror()
:返回传递给它的字符串以及当前 errno 值的文本表示。strerror()
在字符串库中定义。此方法返回指向当前 errno 值的字符串表示形式的指针。
举个例子
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main ()
{
FILE *fp;
/*
If a file, which does not exists, is opened,
we will get an error
*/
fp = fopen("IWillReturnError.txt", "r");
printf("Value of errno: %d\n ", errno);
printf("The error message is : %s\n", strerror(errno));
perror("Message from perror");
return 0;
}
错误号的值:2 错误消息是:没有这样的文件或目录
其他错误处理方式
我们也可以使用exit()
函数中的退出状态常量来通知调用函数错误。可用的两个常量值是EXIT_SUCCESS
和EXIT_FAILURE
。这些只不过是定义了 stdlib.h 头文件的宏。
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
extern int errno;
void main()
{
char *ptr = malloc( 1000000000UL); //requesting to allocate 1gb memory space
if (ptr == NULL) //if memory not available, it will return null
{
puts("malloc failed");
puts(strerror(errno));
exit(EXIT_FAILURE); //exit status failure
}
else
{
free( ptr);
exit(EXIT_SUCCESS); //exit status Success
}
}
此处退出功能用于指示退出状态。以退出状态退出程序总是一个好的做法。退出 _ 成功和退出 _ 失败是用来显示退出状态的两个宏。如果操作成功后程序出来退出 _ 成功用于显示成功退出。它被定义为 0。退出 _ 失败用于程序中出现任何失败的情况。它被定义为-1。
除以零
有些情况下无法处理错误。在 C 语言中,一种这样的情况是被零除。你所能做的就是避免这样做,因为如果你这样做,C 语言就不能理解发生了什么,并给出一个运行时错误。
避免这种情况的最好方法是,在除法运算中使用除数之前检查它的值。可以使用if
条件,如果发现为零,只要显示一条消息,从函数返回即可。