转载:http://www.dingguofeng.com/157
在C语言的标准库中,提供了一些变量和功能函数给用户进行错误处理。先来看一个变量:
int errno ; //这是个错误代码变量,由调用失败的系统函数设置
当一个系统调用或着库函数的调用失败时,将会重置错误代码errno。用户在判断程序出错后,立即检验errno的值可以获取错误代码和错误信息。
例如,我们用fopen()的只读方式打开文件,如果文件不存在,函数返回NULL值。通过对返回值的检查,知道函数已经发生错误。此时,errno的值已经被系统设置为某个数值,这个数值就是错误代码。可以使用printf(“%d” ,errno);的方式来输出和告诉用户错误代码的值。
但是,有了代码以后,我们是怎么通过代码来知道具体的错误信息呢?
在系统中,有一个错误信息表,原型如下:
const char* sys_errlist[]; //错误信息表 , 由系统设置 int sys_nerr; //错误信息表的项目总数,由系统设置。
其实这个表就是个字符串表,可以根据这个表,找到与错误代码相对应的信息。
其实,用户不能直接去使用sys_errlist 这个变量,但是可以间接使用他们,再来看两个函数:
void perror( const char* string ); //把string 字符串输出到标准错误输出上,并追加最后一次系统函数调用的错误信息。 char* strerror( int code ); //返回由参数 code 指定的错误信息。
perror是全自动的把错误信息和用户指定要输出的字符串 string直接输出到标准错误输出上 。
strerror()是根据给定的错误代码来返回字符串形式的错误信息,这就是对sys_errlist[]的间接使用。
现在我们可以做个实验,通过 code 来循环给定全部错误代码,让函数strerror()输出所有的错误信息:
/* test_error_message */ #include <stdio.h> #include <string.h> #include <errno.h> int main( int argc , char* argv[]){ //code 从0开始 int code = 0; //sys_nerr由系统指定,不同的环境可能值不一样,我的环境值为43。 while( code < sys_nerr ) { printf("%d : %s \n" , code , strerror( code ) ); code ++; } return 0; }
C语言中,在实际编程,通常使用perror()来输出错误信息,用strerror()来获取信息。而errno是在当系统调用失败时,将会被设置。所以用户只要检查系统函数是否有错误,如果有错,就可以使用errno来获取错误代码了,然后用strerror()来返回错误代码指定的错误信息。
PS:以下是变量和函数的相关头文件
errno 的头文件为 errno.h
strerror() 头文件为 string.h
perror() 头文件为 stdio.h