在经过一些愚蠢的计算之后抓住Python OverflowError
,我检查了错误args
并看到它是一个包含整数作为其第一个坐标的元组。我假设这是某种错误编号(errno
)。但是,我找不到任何文档或参考资料。
示例:
try:
1e4**100
except OverflowError as ofe:
print ofe.args
## prints '(34, 'Numerical result out of range')'
你知道34
在这种情况下的含义吗?你知道这个例外的其他可能的错误号吗?
答案 0 :(得分:6)
标准库中有一个名为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。
来自float_pow
function的Object/floatobject.c处理 1e4**100
。该函数的部分源代码:
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
异常。