Python リクエストモジュールを使用して try/except を実行する正しい方法は? 質問する

Python リクエストモジュールを使用して try/except を実行する正しい方法は? 質問する
try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print(e)

これは正しいでしょうか? これを構成するより良い方法はあるでしょうか? これですべての要件がカバーされるでしょうか?

ベストアンサー1

リクエストをご覧ください例外ドキュメント。 要するに:

ネットワークの問題 (DNS 障害、接続拒否など) が発生した場合、Requests はConnectionError例外を発生させます。

まれに無効な HTTP 応答が発生した場合、Requests はHTTPError例外を発生させます。

リクエストがタイムアウトすると、Timeout例外が発生します。

リクエストが設定された最大リダイレクト数を超えると、TooManyRedirects例外が発生します。

Requests が明示的に発生させるすべての例外は から継承されますrequests.exceptions.RequestException

ご質問にお答えすると、あなたが示す内容ではすべての問題がカバーされるわけではありません。タイムアウトしたエラーではなく、接続関連のエラーのみがキャッチされます。

例外をキャッチしたときに何をするかは、スクリプト/プログラムの設計次第です。終了しても大丈夫ですか?続行して再試行できますか?エラーが致命的で続行できない場合は、次の例外を発生させてプログラムを中止できます。システム終了(エラーを印刷して を呼び出す便利な方法ですsys.exit)。

すべてのケースを処理する基本クラスの例外をキャッチすることもできます。

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e:  # This is the correct syntax
    raise SystemExit(e)

または、別々にキャッチして、異なる操作を行うこともできます。

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
    # Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
    # Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
    # catastrophic error. bail.
    raise SystemExit(e)

としてキリスト教徒指摘した:

httpエラー(例:401 Unauthorized)で例外を発生させたい場合は、Response.raise_for_statusHTTPError応答が http エラーだった場合は、が発生します。

例:

try:
    r = requests.get('http://www.google.com/nothere')
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)

印刷されます:

404 Client Error: Not Found for url: http://www.google.com/nothere

おすすめ記事