Значение номеров ошибок в исключениях 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
Возникает исключение.