Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Meaning of error numbers in Python exceptions

Catching Python's OverflowError after some dumb calculation, I checked the error's args and saw it's a tuple containing an integer as its first coordinate. I assume this is some kind of error number (errno). However, I could not find any documentation or reference for it.

Example:

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

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

Do you know what 34 means in this context? Do you know other possible error numbers for this exception?

like image 583
Bach Avatar asked Apr 09 '14 07:04

Bach


People also ask

What are exception errors in Python?

An exception is an event, which occurs during the execution of a program that disrupts the normal flow of the program's instructions. In general, when a Python script encounters a situation that it cannot cope with, it raises an exception. An exception is a Python object that represents an error.

What is value error exception in Python?

The Python ValueError is an exception that occurs when a function receives an argument of the correct data type but an inappropriate value. This error usually occurs in mathematical operations that require a certain kind of value.

What are the 3 errors in Python?

In python there are three types of errors; syntax errors, logic errors and exceptions.

How do you fix exception errors in Python?

In Python, exceptions can be handled using a try statement. The critical operation which can raise an exception is placed inside the try clause. The code that handles the exceptions is written in the except clause. We can thus choose what operations to perform once we have caught the exception.


1 Answers

There is a module in the standard library called errno:

This module makes available standard errno system symbols. The value of each symbol is the corresponding integer value. The names and descriptions are borrowed from linux/include/errno.h, which should be pretty all-inclusive.

/usr/include/linux/errno.h includes /usr/include/asm/errno.h that includes /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 */

Now we know that the 34 error code stands for ERANGE.

1e4**100 is processed with float_pow function from Object/floatobject.c. Partial source code of that function:

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);
}

So, 1e4**100 causes ERANGE error (resulting in PyExc_OverflowError) and then the higher level OverflowError exception raises.

like image 166
vaultah Avatar answered Sep 19 '22 00:09

vaultah