c语言库函数中有error函数吗?

Python011

c语言库函数中有error函数吗?,第1张

c语言标准库函数里没有error函数。C语言对异常的处理确实不够好,大多的时候都需要人工除错。有几个类似的函数,分别处理各种情况下的异常:ferror函数:在调用各种输入输出函数(如putc.getc.fread.fwrite等)时,如果出现错误,除了函数返回值有所反映外,还可以用ferror函数检查。它的一般调用形式为ferror(fp);如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件每一次调用输入输出函数,均产生一个新的ferror函数值,因此,应当在调用一个输入输出函数后立即检查ferror函数的值,否则信息会丢失。在执行fopen函数时,ferror函数的初始值自动置为0。在库函数中有个errno变量,每个errno值对应着以字符串表示的错误类型。当你调用"某些"函数出错时,该函数已经重新设置了errno的值。perror函数只是将你输入的一些信息和现在的errno所对应的错误一起输出。perror函数:用来将上一个函数发生错误的原因输出到标准设备(stderr)。参数s所指的字符串会先打印出,后面再加上错误原因字符串。此错误原因依照全局变量errno的值来决定要输出的字符串。strerror函数:用来从错误号码查用英文表达的错误内容,返回指针,指向这段英文字符串。如果你不知道错误号,那么在出错发生时,及时用errno的当前值作参数,打印这段字符串。

errno会返回一个数字,每个数字代表一个错误类型。详细的可以查看头文件。/usr/include/asm/errno.h

如何把errno的数字转换成相应的文字说明?

方式一:可以使用strerrno函数

char

*strerror(int

errno)

使用方式如下:

fprintf(stderr,"error

in

CreateProcess

%s,

Process

ID

%d

",strerror(errno),processID)

将错误代码转换为字符串错误信息,可以将该字符串和其它的信息组合输出到用户界面。

注:假设processID是一个已经获取了的整形ID

方式二:使用perror函数

void

perror(const

char

*s)

函数说明

perror

(

)用来将上一个函数发生错误的原因输出到标准错误(stderr),参数s

所指的字符串会先打印出,后面再加上错误原因

字符串。此错误原因依照全局变量

errno

的值来决定要输出的字符串。

另外并不是所有的c函数调用发生的错误信息都会修改errno。例如gethostbyname函数。

errno是否是线程安全的?

errno是支持线程安全的,而且,一般而言,编译器会自动保证errno的安全性。

我们看下相关头文件

/usr/include/bits/errno.h

会看到如下内容:

#

if

!defined

_LIBC

||

defined

_LIBC_REENTRANT

/*

When

using

threads,

errno

is

a

per-thread

value.

*/

#

define

errno

(*__errno_location

())

#

endif

#

endif

/*

!__ASSEMBLER__

*/

#endif

/*

_ERRNO_H

*/

也就是说,在没有定义__LIBC或者定义_LIBC_REENTRANT的时候,errno是多线程/进程安全的。

为了检测一下你编译器是否定义上述变量,不妨使用下面一个简单程序。

#include

<stdio.h>

#include

<errno.h>

int

main(

void

)

{

#ifndef

__ASSEMBLER__

printf(

"Undefine

__ASSEMBLER__/n"

)

#else

printf(

"define

__ASSEMBLER__/n"

)

#endif

#ifndef

__LIBC

printf(

"Undefine

__LIBC/n"

)

#else

printf(

"define

__LIBC/n"

)

#endif

#ifndef

_LIBC_REENTRANT

printf(

"Undefine

_LIBC_REENTRANT/n"

)

#else

printf(

"define

_LIBC_REENTRANT/n"

)

#endif

return

0

}

一般都是在处理文件时用到的比较多,如:

  #include <stdio.h>

  #include <stdlib.h>

  int main(void)

  {

    perror("File error ")

  }

  

  

  #include <stdio.h>

  #include <stdlib.h>

  int main(void){

     FILE *fp

     if((fp=fopen("test", "rb"))==NULL) {

        printf("Cannot open file.\n")

        exit(1)

     }

     putc('C', fp)

     if(ferror(fp)) { // 检测文件是否出错

       printf("File Error\n")

       exit(1)

     }

    

     fclose(fp)

     return 0

  }