1. ホーム
  2. python

[解決済み] Pythonのリクエストモジュールを使ってtry/exceptする正しい方法?

2022-03-17 12:58:55

質問

try:
    r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
    print e #should I also sys.exit(1) after this?

これは正しいのでしょうか?もっと良い構成はないのでしょうか?これですべてのベースがカバーできるでしょうか?

どのように解決するのですか?

リクエストを見てください。 例外に関する文書 . 要するに

ネットワークに問題が発生した場合 (例: 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_status . これは HTTPError もし、レスポンスが 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