Значение номеров ошибок в исключениях Python

Ловить питона OverflowError после некоторого тупого расчета я проверил ошибку args и увидел, что это кортеж, содержащий целое число в качестве своей первой координаты. Я предполагаю, что это какой-то номер ошибки (errno). Однако я не смог найти никакой документации или ссылки на него.

Пример:

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

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

Знаешь что 34 значит в этом контексте? Знаете ли вы другие возможные номера ошибок для этого исключения?

1 ответ

Решение

В стандартной библиотеке есть модуль, который называется 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 обрабатывается с float_pow функция из объекта / floatobject.c. Частичный исходный код этой функции:

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 Возникает исключение.

Другие вопросы по тегам