出错处理
1.错误检查
函数执行失败时,一般都会返回一个特定的值,比如-1,空指针等等。这些值只能说明有错误发生,而不能指出错误的原因。头文件errno.h定义了变量errno,它存储了错误发生时的错误码,通过错误码可以得到错误信息的描述。
程序开始执行时,变量errno被初始化为0,。很多库函数在执行过程中遇到错误就会将errno设置为相应的错误码。注:不能根据errno的值来判断一个函数是否正常执行。
例程
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
FILE *fp;
char *filename = "only_root.txt";
errno = 0;
fp = fopen(filename, "r");
if(fp == NULL)
printf("open file %s failed, error is %d\n", filename, errno);
else
printf("open file %s successfully!\n", filename);
}
运行结果
2对应错误码ENOENT,得到出错原因是文件或目录不存在。
附一个errno错误码对照表链接
https://blog.csdn.net/ylwdi/article/details/24628927
2.错误的提示信息
当程序出现错误时,应当打印相应的错误提示信息,以便程序员发现并修改错误。函数strerror和perror可以通过错误码获取标准的错误信息提示。
strerror函数在头文件string.h中声明。
#include<string.h>
char *strerror(int errnum);
strerror函数根据参数errnum提供的错误码获取一个描述错误信息的字符串,函数的返回值为指向该字符串的指针。errnum的值通常就是errno。
perror函数声明在头文件stdio.h中。
#include<stdio.h>
void perror(const char *massage);
perror打印错误信息到stderr,stderr在Linux中通常就是屏幕或命令行终端。调用perror时。若参数message是一个空指针,perror仅仅根据errno打印出对应的错误提示信息。如果提供一个非空的值,perror会把此message加在其输出信息的前面。perror会添加一个冒号和空格将message和错误信息分开,以便区分。
例程
#include<stdio.h>
#include<string.h>
#include<errno.h>
#include<stdlib.h>
FILE *open_file(char *filename)
{
FILE *fp;
errno = 0;
fp = fopen(filename, "r");
if(fp == NULL)
{
printf("Open file %s failed, reason is %s\n", filename, strerror(errno));
exit(-1);
}
else
return fp;
}
int main()
{
char *filename = "ABC";
open_file(filename);
return 0;
}
运行结果
主程序调用open_file函数来打开文件名为ABC的文件,但是文件不存在,strerror通过errno的值将错误信息打印出来。
touch ABC后将权限更改以后再执行程序
其实这里我们可以显然发现,strerror函数就是通过对照errno表,将其后的注释打印出来
比如