Requests: Python 3でのリクエストの不正なエラー処理[上記の例外の処理中に、別の例外が発生しました]

作成日 2019年12月16日  ·  3コメント  ·  ソース: psf/requests

Python3を使用するリクエストライブラリは、かなり悪い方法で例外を処理します。 python2では、これは正常に機能します。 python2インストール済みリクエストライブラリとpython3インストール済みリクエストライブラリの両方を使用して、 requests.get('https://api.github.com')を使用してGitHubをリクエストしようとしました。 ネットワークがダウンしているときにリクエストが行われると、パフォーマンスが異なります。 (例外は別の方法で処理されます)。 python2とpython3の両方にリクエストをインストールしてみてください。リクエストを行うときにインターネット接続を削除することで、問題を再現できます。 私が使用したコード
import requests
requests.get('https://api.github.com')

システムにrequests==2.5.3をインストールし、バージョンをrequests==2.22.0アップグレードしようとしましたが、それでも問題が解決しません。

期待される結果

python2では、次のようなよりクリーンな例外が発生します
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 65, in get return request('get', url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 49, in request response = session.request(method=method, url=url, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 461, in request resp = self.send(prep, **send_kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 573, in send r = adapter.send(request, **kwargs) File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 415, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', gaierror(-2, 'Name or service not known'))

実結果

`
トレースバック(最後の最後の呼び出し):
_new_connのファイル "/usr/local/lib/python3.6/site-packages/urllib3/connection.py"、行157
(self._dns_host、self.port)、self.timeout、** extra_kw
create_connectionのファイル "/usr/local/lib/python3.6/site-packages/urllib3/util/connection.py"、行61
socket.getaddrinfo(host、port、family、socket.SOCK_STREAM)のresの場合:
getaddrinfoのファイル "/usr/lib/python3.6/socket.py"、行745
_socket.getaddrinfo(host、port、family、type、proto、flags)のresの場合:
socket.gaierror:[Errno-2]名前またはサービスが不明

上記の例外の処理中に、別の例外が発生しました。

トレースバック(最後の最後の呼び出し):
ファイル "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py"、行672、urlopen
チャンク=チャンク、
_make_requestのファイル "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py"、行376
self._validate_conn(conn)
_validate_connのファイル "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py"、行994
conn.connect()
ファイル "/usr/local/lib/python3.6/site-packages/urllib3/connection.py"、334行目、connect
conn = self._new_conn()
_new_connのファイル "/usr/local/lib/python3.6/site-packages/urllib3/connection.py"、行169
self、 "新しい接続の確立に失敗しました:%s"%e
urllib3.exceptions.NewConnectionError::新しい接続の確立に失敗しました:[Errno-2]名前またはサービスが不明です

上記の例外の処理中に、別の例外が発生しました。

トレースバック(最後の最後の呼び出し):
ファイル "/usr/local/lib/python3.6/site-packages/requests/adapters.py"、449行目、送信
タイムアウト=タイムアウト
ファイル "/usr/local/lib/python3.6/site-packages/urllib3/connectionpool.py"、行720、urlopen
メソッド、url、error = e、_pool = self、_stacktrace = sys.exc_info()[2]
ファイル "/usr/local/lib/python3.6/site-packages/urllib3/util/retry.py"、行436、増分
MaxRetryError(_pool、url、errorまたはResponseError(cause))を発生させます
urllib3.exceptions.MaxRetryError:HTTPSConnectionPool(host = 'api.github.com'、port = 443):URLで最大再試行回数を超えました:/(NewConnectionError( ':新しい接続の確立に失敗しました:[Errno-2]名前またはサービスが不明です '、))

上記の例外の処理中に、別の例外が発生しました。

トレースバック(最後の最後の呼び出し):
ファイル ""、1行目、
ファイル "/usr/local/lib/python3.6/site-packages/requests/api.py"、75行目、get
return request( 'get'、url、params = params、 * kwargs)ファイル "/usr/local/lib/python3.6/site-packages/requests/api.py"、行60、リクエストsession.request(method = method、url = url、* kwargs)を返します
ファイル "/usr/local/lib/python3.6/site-packages/requests/sessions.py"、行533、リクエスト
resp = self.send(prep、 * send_kwargs)ファイル "/usr/local/lib/python3.6/site-packages/requests/sessions.py"、行646、送信r = adapter.send
ファイル "/usr/local/lib/python3.6/site-packages/requests/adapters.py"、行516、送信
ConnectionError(e、request = request)を発生させます
requests.exceptions.ConnectionError:HTTPSConnectionPool(host = 'api.github.com'、port = 443):URLで最大再試行回数を超えました:/(NewConnectionError( ':新しい接続の確立に失敗しました:[Errno-2]名前またはサービスが不明です '、))

`

複製手順

import requests

システムインフォメーション

$ python -m requests.help
Python 2.7.15+ (Python2 version)
requests==2.5.3 (Requests version in python2)
=============================
Python 3.6.9 (Python3 version)
requests==2.5.3(Requests version in python3)
=============================
OS: Ubuntu 18.04.3 LTS

このコマンドは、Requestsv2.16.4以降でのみ使用できます。 さもないと、
システムに関する基本的な情報をいくつか提供してください(Pythonバージョン、
オペレーティングシステム、&c)。

最も参考になるコメント

同じ問題に遭遇したばかりですが、この回避策でエラー後も続行する方法はありますか?
発生した例外の後でプログラムを終了するべきではありませんが、それを行う方法が見つかりませんでした。

全てのコメント3件

私もこの問題に遭遇しましたが、よりきれいな出力の回避策を見つけました。 ここのスクリプトの「fromNone」に注意してください。

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

上記のスクリプトを実行すると、出力ははるかにクリーンになります。

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Python3ではfrom Noneしか実行できません。これは、次のPEPからのものだと思います: https ://www.python.org/dev/peps/pep-0409/

私もこの問題に遭遇しましたが、よりきれいな出力の回避策を見つけました。 ここのスクリプトの「fromNone」に注意してください。

import requests
url = 'http://10.0.0.12/example/'
try:
    requests.get(url, timeout=2)
except requests.exceptions.RequestException:
    raise Exception('Failed to connect to %s' % url) from None

上記のスクリプトを実行すると、出力ははるかにクリーンになります。

$ python example.py
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    raise Exception('Failed to connect to %s' % url) from None
Exception: Failed to connect to http://10.0.0.12/example/

Python3ではfrom Noneしか実行できません。これは、次のPEPからのものだと思います: https ://www.python.org/dev/peps/pep-0409/

同じ問題に遭遇したばかりですが、この回避策でエラー後も続行する方法はありますか?
発生した例外の後でプログラムを終了するべきではありませんが、それを行う方法が見つかりませんでした。

このページは役に立ちましたか?
0 / 5 - 0 評価