errno.h

errno.h错误

  • 标准库中的一些函数通过向<errno.h>中声明的int类型errno变量存储一个错误码(正整数)来表示有错误发生。
  • 大部分使用errno变量的函数集中在<math.h>,但也有一些在标准库的其他部分。
  • 假设我们需要使用一个库函数,该库函数通过给errno赋值来产生程序运行出错的信号。
    在调用这个函数之后,我们可以检查errno的值是否为零。如果不为零。 则表示在函数调用过程中有错误发生。
    举例来说,假如需要检查sqrt函数的调用是否出错,可以使用类似下面的代码:
errno = 0;
y = sqrt(x);
if(errno != 0)
{
	fprintf(stderr,"sqrt error; program terminated.\n");
	exit(EXIT_FAILURE);
}
  • 当使用errno来检测库函数调用中的错误时,在函数调用前将errno置零非常重要。
    虽然在程序刚开始运行时errno的值为零,但有可能在随后的函数调用中已经被改动了。库函数不会将errno清零,这是程序需要做的事情。

  • 当错误发生时,向errmo中存储的值通常是EDOM或ERANGE。(这两个宏都定义在<errno.h>中。)这两个值代表调用数学函数时可能发生的两种错误。

  • 定义域错误(EDOM): 传递给函数的一个参数超出了函数的定义域。 例如,用负数作为sqrt的参数就会导致定义域错误。

  • 取值范围错误(ERAMNGE): 函数的返回值太大,无法用返回类型表示。例如,用1000作为exp函数的参数就经常会导致取值范围错误,因为e^1000太大以致无法在大多数计算机上用double类型表示。

  • 一些函数可能会同时导致这两种错误,我们可以用errno分别与EDOM和ERANGE比较,然后确定究竟发生了哪种错误。

perror和strerror函数

下面看两个与变量errno有关的函数,不过这两个函数都不属于<errno.h>

1、perror函数

  • 当库函数问errno存储了一个非零值时,可能会希望显示一条描述这种错误的消息。
  • 一种实现方式是调用perror函数,它会按顺序显示以下信息: (1) 调用perror的参数,(2)个冒号, (3)一个空格, (4)一条出错消息,消息的内容根据errno的值决定,(5)一个换行符。 perror函数会输出到stderr流,而不是标准输出。

下面是一个使用perror的例子:

errno = 0;
y = sqrt(x);
if(errno != 0)
{
	perror("sqrt error");
	exit(EXIT_FAILURE);
}
  • 如果sqrt调用因定义域错误而失败,perror会产生如下输出:
    sqrt error : Numerical argument out of domain
  • perror函数在sqrt error后所显示的出错消息是由实现定义的。
    在这个例子中,Numerical argument out of domain是与EDOM错误相对应的消息。ERANGE错误通常会对应于不同的消息,例如Numerical result out of range.

2、strerror函数

  • 当以错误码为参数调用strerror时,函数会返回一个指针,它指向描述这个错误的字符串。 例如,调用
    puts(strerror(EDOM));
    可能会显示:
    Numerical argument out of domain
  • strerror函数的参数通常是errno的值,但以任意整数作为参数时strerror都能返回一个字符串。
  • strerror与perroro函数密切相关。如果strerror的参数为errno,那么perror所显示的出错信息与strerror所返回的消息是相同的。

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/85632594