8

OverflowError在一些愚蠢的计算之后捕获 Python ,我检查了错误args并看到它是一个包含整数作为其第一个坐标的元组。我认为这是某种错误号 ( errno)。但是,我找不到任何文档或参考。

例子:

try:
    1e4**100
except OverflowError as ofe:
    print ofe.args

## prints '(34, 'Numerical result out of range')'

你知道34在这种情况下是什么意思吗?您知道此异常的其他可能错误编号吗?

4

1 回答 1

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。

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引发更高级别的异常。

于 2014-04-09T07:39:10.050 回答