11

私はこれだけで Python Requests ConnectionErrors をキャッチして印刷しています:

except requests.exceptions.ConnectionError as e:
    logger.warning(str(e.message))

次のようなメッセージを出力します。

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 61] Connection refused)

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 65] No route to host)

そして他の多く。私が疑問に思っているのは、メッセージに表示されている errno を取得するための最良の、最も Pythonic な方法は何ですか? 問題をキャッチし、可能な限り有用で適切なエラー メッセージをユーザーに提供するための信頼できるシステムが必要です。私が知る限り、ConnectionError は BaseException の間接的な子孫であり、BaseException が提供する以上の新しいプロパティやメソッドは追加されていません。すべてのエラーメッセージがすべての地域で同じようにフォーマットされていると仮定するリスクがあるように思われるため、単純に正規表現を使用することをためらっています。

4

2 に答える 2

33

でアクセスできると思いますe.args[0].reason.errno

これはおそらくどこかに文書化されていますが、通常、このようなことを追跡する必要がある場合は、コンソールで試して、少し掘り下げます. (私は IPython を使用しているので、タブ インスペクションを行うのは簡単ですが、それなしで試してみましょう)。

まず、を使用してエラーを生成しましょう

import requests
try:
    requests.get("http://not.a.real.url/really_not")
except requests.exceptions.ConnectionError as e:
    pass

次のエラーが表示されeます。

>>> e
ConnectionError(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),)

情報は通常args次の場所にあります。

>>> e.args
(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),)
>>> e.args[0]
MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",)

内部を見ると、次のことがわかります。

>>> dir(e.args[0])
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
 '__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__',
 '__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'message', 'pool',
 'reason', 'url']

reason励みになります:

>>> e.args[0].reason
gaierror(-2, 'Name or service not known')
>>> dir(e.args[0].reason)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__',
 '__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__',
 '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__',
 '__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'errno', 'filename',
 'message', 'strerror']
>>> e.args[0].reason.errno
-2
于 2013-10-14T22:53:10.513 に答える