8

OverflowErrorばかげた計算の後でPython をキャッチして、エラーをチェックしargsたところ、最初の座標として整数を含むタプルであることがわかりました。これは何らかのエラー番号 ( errno) だと思います。ただし、ドキュメントやリファレンスは見つかりませんでした。

例:

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

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

34この文脈で何を意味するか知っていますか?この例外の可能性のある他のエラー番号を知っていますか?

4

1 に答える 1

6

標準ライブラリには、次のモジュールがあります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**100Object/floatobject.cのfloat_pow関数で処理されます。その関数の部分的なソース コード:

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**100ERANGE エラーが発生し (結果としてPyExc_OverflowError)、上位レベルのOverflowError例外が発生します。

于 2014-04-09T07:39:10.050 に答える