Chinaunix首页 | 论坛 | 博客
  • 博客访问: 388320
  • 博文数量: 39
  • 博客积分: 1982
  • 博客等级: 上尉
  • 技术积分: 468
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-07 13:47
文章分类

全部博文(39)

文章存档

2012年(5)

2011年(16)

2010年(18)

分类: LINUX

2011-04-15 16:18:17

本文中的错误是指在代码编译完全正确程序可运行的情况下,因为没有成功调用程序中的某些系统调用函数而产生的错误。往往这些系统调用函数通过返回值(比如1,0,-1)来说明其是否调用成功,而程序员需要知道详细的错误信息,因此自建错误捕获函数很有必要。

(1)errno和strerror()

errno它是一个整形的错误代码。当发生错误的时候,系统自动将错误代码赋给errno。使用下面的方法可以获得具体的错误描述:

  1. void my_err(int error)

  2. {

  3.     printf("error: %s with errno: %d\n",strerror(error),error);

  4.     exit(1);

  5. }
  6. int main()
  7. {
  8.         ..............

  9.         my_err(errno);

  10.         ..............

  11. }
 
其中char *strerror(int errnum);是通过errnum来获取错误描述,errnum即所传递的errno。该函数末尾的exit(1)使得程序发生错误时退出。但应该包含库函数stdlib.h。

下面进行测试,测试程序(源代码在本文末尾。)使用open()函数创建文件,因为要创建的文件已存在,而且使用了O_EXCL参数,因此open()会产生错误。结果如下:

  1. edsionte@edsionte-laptop:~/code$ ./error

  2. error: File exists with errno: 17
 
该方法可以详细显示错误信息以及错误代码。但不能显示错误出现的行数。

(2)perror()

其函数原型为:void perror(const char *s)。s一般是函数名。该函数会先将函数名打印出来,然后再打印出错误信息。错误信息与errno相对应。第二个参数__LINE__是一个宏,表示当前的行数。使用方法:

  1. void my_err2(const char* err_string,int line)

  2. {

  3.     fprintf(stderr,"error: line:%d ",line);

  4.     perror(err_string);

  5.         exit(1);

  6. }

  7. }

  8. int main()
  9. {
  10.             .................

  11.         my_err2("open",__LINE__);

  12.                 ................

  13. }
 
测试结果如下:
  1. edsionte@edsionte-laptop:~/code$ ./error

  2. error: line:29 open: File exists

  3. }
 
该方法可以显示错误信息以及错误出现的行数。

以上方法是在《linux C编程》中常用的方法,我适当的作了小调整。现在将这两种方法结合起来:

  1. void my_err3(const char* err_string,int line,int error)
  2. {

  3.     printf("error: line:%d %s():%s with errno:%d\n",line,err_string,strerror(error),error);

  4.         exit(1);

  5. }

  6. int main()
  7. {
  8.             ................

  9.         my_err3("open",__LINE__,errno);

  10.             ................

  11. }
 
测试结果如下:
  1. ./error

  2. error: line:30 open():File exists with errno:17
 
这样就可以显示错误代码,错误描述,错误出现的行数以及出现错误的函数。对于和我一样的新手来说,这里特别要注意的是宏__LINE__前后的那个横线是两个连续的下划线,而不是_LINE_,否则会出现错误。
源代码如下:
说明:本程序只作测试用,为了同时显示三种错误捕获函数的信息,因此屏蔽了每个函数的exit(1)。另外本文头文件函数用“”是因为显示问题,没有什么特别意义。
 
 
  1. #include "errno.h"
  2. #include "fcntl.h"
  3. #include "unistd.h"
  4. #include "stdlib.h"
  5. #include "stdio.h
  6. #include "sys/types.h"
  7. #include "sys/stat.h"
  8. #include "string.h"

  9. void my_err(int error)

  10. {
  11.     printf("error: %s with errno: %d\n",strerror(error),error);

  12. // exit(1);

  13. }

  14. void my_err2(const char* err_string,int line)
  15. {

  16.     fprintf(stderr,"error: line:%d ",line);

  17.     perror(err_string);

  18. // exit(1);

  19. }

  20. void my_err3(const char* err_string,int line,int error)
  21. {

  22.     printf("error: line:%d %s():%s with errno:%d\n",line,err_string,strerror(error),error);

  23. // exit(1);

  24. }

  25. int main()
  26. {
  27.     int fd;
  28.     if((fd=open("example_test.c",O_CREAT|O_EXCL,S_IRUSR|S_IWUSR))==-1)
  29.     {
  30.         my_err(errno);
  31.         my_err2("open",__LINE__);
  32.         my_err3("open",__LINE__,errno);
  33.     }
  34.     close(fd);
  35.     return 0;
  36. }


阅读(6470) | 评论(0) | 转发(0) |
0

上一篇:C语言笔记本

下一篇:Linux 进程状态 说明

给主人留下些什么吧!~~