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_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