C语言中的错误处理可以通过以下函数和全局变量去跟踪
-
errno
系统预定义的全局变量,在库函数出错的时候,可以设置errno的值。然后根据其值找到对应描述符的信息 strerror(3)
#include<string.h>
char *strerror(int errnum)
功能:返回错误编号对应的描述错误的字符串
找不到错误的编号,返回“unknown error nnn”的首地址
找到错误编号,返回描述错误的字符串的首地址
perror
#include<stdio.h>
void perror(const chart *s);
功能:输出最近一次函数调用的错误信息,s是用户自定义字符串。该函数没有返回值
练习一:
#include<stdio.h>
#include<string.h>
#include<errno.h>
int main(int argc, char *argv[]){
FILE *fp = fopen(argv[1], "r");
if(fp == NULL){
printf("fopen failed: %s\n", strerror(errno));
return -1;
}
printf("fopen success.\n");
fclose(fp);
return 0;
}
测试:
zhongjun@eclipse:~/linkTest$ gcc error_test.c -o hell
zhongjun@eclipse:~/linkTest$ touch aa
zhongjun@eclipse:~/linkTest$ ls -l aa
-rw-rw-r-- 1 zhongjun zhongjun 0 3 15 16:34 aa
zhongjun@eclipse:~/linkTest$ chmod 222 aa
zhongjun@eclipse:~/linkTest$ ./hell aa
fopen failed: Permission denied
zhongjun@eclipse:~/linkTest$ ls -l aa
--w--w--w- 1 zhongjun zhongjun 0 3 15 16:34 aa
aa文件没有读权限。
测试2:
#include<stdio.h>
int main(int argc, char *argv[]){
FILE *fp = fopen(argv[1], "r");
if(fp == NULL){
perror("fopen: ");
return -1;
}
printf("fopen success.\n");
fclose(fp);
return 0;
}
输出:
zhongjun@eclipse:~/linkTest$ gcc error_test.c -o hell2
zhongjun@eclipse:~/linkTest$ ./hell2 aa
fopen: : Permission denied
宏定义方法:
//s_stdio.h
#ifndef S_STDIO_H_
#define S_STDIO_H_
#define E_MSG(STR, VAL) do{perror(STR); return (VAL);}while(0)
#endif
#include<stdio.h>
#include"s_stdio.h"
int main(int argc, char *argv[]){
FILE *fp = fopen(argv[1], "r");
if(fp == NULL){
E_MSG("fopen", -1);
}
printf("fopen success.\n");
fclose(fp);
return 0;
}
输出:
zhongjun@eclipse:~/linkTest$ gcc error_test.c -o hell3
zhongjun@eclipse:~/linkTest$ ./hell3 aa
fopen: Permission denied
网友评论