The GNU C Library Reference Manual—Error Reporting笔记(2)

来源:互联网 发布:excel数据分析描述统计 编辑:程序博客网 时间:2024/05/22 01:42

随学随记,暂时未经编程验证  Written by HOOK_TTG(Jamie Jiang)

1、一般来说,大多数库函数在发生错误时会返回一个特定的值来表示函数执行发生了错误。这个值通常是“-1”或者一个空指针“NULL”也有可能是一个常量,就像“EOF”来表示已经读取到文件结尾了一样。

2、如果想在程序发生错误时能够知道这个错误代码并且能显示这个错误的信息,那么就需要包含“errno.h”头文件。这个头文件中定义了“errno”变量来保存最近一次错误发生时的错误代码。

3、对“errno”变量使用的注意事项: 

  • 这个变量是一个 “int”整型变量,因此可以使用“switch”语句来因地制宜的处理错误代码。
  • 函数执行发生错误时,会修改这个变量的值为这个错误的代码;但是,函数执行没有发生错误正常返回时,就不会修改这个变量的值,那么这个变量的值就还是在调用这个函数前所拥有的值。
  • 一般来说,库函数执行发生错误都会修改这个值,所以如果想在调用一个函数的时候知道是否发生错误,就需要首先在调用函数前将errno值0,然后在函数执行完毕且在执行任何后续操作之前,紧接着就检查这个“errno”的值。否则可能就得不到正确的值。
  • 如果需要对错误代码做一些后续处理,那么最好先备份好“errno”的值,以防调用后续函数被修改。

4、常用的处理错误信息的函数:

  • char * strerror (int errnum)在“string.h”中定义:接受一个错误代码,返回这个错误代码对应的错误信息字符串。由于函数将这个返回的错误信息字符串防止在一个全局的静态字符串变量中,不要尝试修改函数返回的这个字符串。并且一般不用于多线程程序,因为每次调用这个函数都会刷新这个错误信息字符串。有可能造成各个线程得不到正确的错误信息。
  • char * strerror_r (int errnum, char *buf, size_t n)在“string.h”中定义:基本与“strerror”功能类似,但是这个函数还会将错误信息拷贝一份放置到输入参数“buf”缓冲区中,“n”指定字符串长度。支持多线程,因为输出至“buf”中的字符串是一份对调用此函数线程私有的拷贝。
  • void perror (const char *message)在“stdio.h”中定义:打印输入的错误信息字符串。如果参数“message”为“NULL”空指针,那么将输出当前“errno”变量的值所对应的错误信息字符串,并换行。如果参数“message”不为“NULL”,那么将输出这个字符串。输出方式是先输出传入的字符串,紧接着输出一个“”和空格“ ”,再输出当前“errno”对应的错误信息字符串。

5、GNU系统扩展提供的方便使用的变量,Win32系统没有:

  • char * program_invocation_name:对应与“argv[0]”的值。保存当前可执行程序的完整名称,包含路径。对于Win32系统,只有自己手动读取“argv[0]”的值。
  • char * program_invocation_short_name:保存当前可执行程序的程序文件名,不包含路径。对于Win32系统,只有自己手动读取“argv[0]”的值并分解出文件名。

6、GNU系统扩展提供的其他便利函数,Win32系统没有。

      在“error.h”中定义:

  • void error (int status, int errnum, const char *format, . . . )
  • void error_at_line (int status, int errnum, const char *fname, unsigned int lineno, const char *format, . . . )
  • void (*) error_print_progname (void)

     “err.h”中定义,用于BSD系统

  • void warn (const char *format, . . . )
  • void vwarn (const char *format, va list)
  • void warnx (const char *format, . . . )
  • void vwarnx (const char *format, va list)
  • void err (int status, const char *format, . . . )
  • void verr (int status, const char *format, va list)
  • void errx (int status, const char *format, . . . )
  • void verrx (int status, const char *format, va list)       
原创粉丝点击