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.