zoukankan      html  css  js  c++  java
  • linux c 系统报错

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

    (1)errno和strerror()

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

    1. void my_err(interror)
    2. {
    3.     printf("error: %s with errno: %d ",strerror(error),error);
    4.     exit(1);
    5. }
    6. intmain()
    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.     fprintf(stderr,"error: line:%d ",line); 
    3.     perror(err_string); 
    4.         exit(1); 
    5. int main() 
    6.             ................. 
    7.         my_err2("open",__LINE__); 
    8.                 ................ 
    9. }
     
    测试结果如下:
    1. edsionte@edsionte-laptop:~/code$ ./error 
    2. error: line:29 open: File exists 
    3. }
     
    该方法可以显示错误信息以及错误出现的行数。

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

    1. void my_err3(constchar*err_string,intline,interror)
    2. {
    3.     printf("error: line:%d %s():%s with errno:%d ",line,err_string,strerror(error),error);
    4.         exit(1);
    5. }
    6. intmain()
    7. {
    8.             ................
    9.         my_err3("open",__LINE__,errno);
    10.             ................
    11. }
     
    测试结果如下:
    1. edsionte@edsionte-laptop:~/code$ ./error 
    2. error: line:30 open():File exists with errno:17
     
    这样就可以显示错误代码,错误描述,错误出现的行数以及出现错误的函数。对于和我一样的新手来说,这里特别要注意的是宏__LINE__前后的那个横线是两个连续的下划线,而不是_LINE_,否则会出现错误。
    源代码如下:
    说明:本程序只作测试用,为了同时显示三种错误捕获函数的信息,因此屏蔽了每个函数的exit(1)。另外本文头文件函数用“”是因为显示问题,没有什么特别意义。

     

     
  • 相关阅读:
    leetcode 190 Reverse Bits
    vs2010 单文档MFC 通过加载位图文件作为客户区背景
    leetcode 198 House Robber
    记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
    逆序数2 HDOJ 1394 Minimum Inversion Number
    矩阵连乘积 ZOJ 1276 Optimal Array Multiplication Sequence
    递推DP URAL 1586 Threeprime Numbers
    递推DP URAL 1167 Bicolored Horses
    递推DP URAL 1017 Staircases
    01背包 URAL 1073 Square Country
  • 原文地址:https://www.cnblogs.com/lvdongjie/p/4153235.html
Copyright © 2011-2022 走看看