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?
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.
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.
In python there are three types of errors; syntax errors, logic errors and exceptions.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With