标准库中有一个模块叫做errno
:
该模块提供标准 errno 系统符号。每个符号的值是对应的整数值。名称和描述是从 linux/include/errno.h 借来的,它应该是包罗万象的。
/usr/include/linux/errno.h
包括/usr/include/asm/errno.h
包括/usr/include/asm-generic/errno-base.h
。
me@my_pc:~$ cat /usr/include/asm-generic/errno-base.h | grep 34
#define ERANGE 34 /* Math result not representable */
现在我们知道 34 错误代码代表 ERANGE。
1e4**100
使用Object/floatobject.c中的float_pow
函数进行处理。该函数的部分源代码:
static PyObject *
float_pow(PyObject *v, PyObject *w, PyObject *z)
{
// 107 lines omitted
if (errno != 0) {
/* We do not expect any errno value other than ERANGE, but
* the range of libm bugs appears unbounded.
*/
PyErr_SetFromErrno(errno == ERANGE ? PyExc_OverflowError :
PyExc_ValueError);
return NULL;
}
return PyFloat_FromDouble(ix);
}
因此,1e4**100
导致 ERANGE 错误(导致PyExc_OverflowError
),然后OverflowError
引发更高级别的异常。