try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
これは間違いありませんか?これを構造化するより良い方法はありますか?これは私のすべての基地をカバーするだろうか?Pythonリクエストモジュールを使用する以外は試してみてください。
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
これは間違いありませんか?これを構造化するより良い方法はありますか?これは私のすべての基地をカバーするだろうか?Pythonリクエストモジュールを使用する以外は試してみてください。
リクエストexception docsをご覧ください。要するに:ネットワークの問題が発生した場合
(例えばDNS障害、接続、などを拒否した)、要求は
ConnectionError
例外が発生します。まれな無効なHTTP応答の場合、要求は
HTTPError
例外を発生させます。要求がタイムアウトすると、
Timeout
例外が発生します。要求が設定された最大リダイレクト回数を超えた場合は、
TooManyRedirects
例外が発生します。リクエストが明示的に継承するすべての例外は、
requests.exceptions.RequestException
から継承します。
あなたの質問に答えるために、何を示していることはは、あなたの拠点のすべてをカバーしています。タイムアウトしたものではなく、接続関連のエラーだけを検出します。
例外をキャッチするときの対処は、スクリプト/プログラムの設計上です。退室しても構いませんか?あなたは行くことができますか?エラーが致命的で、続行できない場合は、sys.exit()
への呼び出しが順番に行われます。
あなたはすべてのケースを処理するこれ、基本クラスの例外をキャッチすることができ、次のいずれか
try:
r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e: # This is the correct syntax
print e
sys.exit(1)
それとも、それらを別々にキャッチし、さまざまなことを行うことができます。 Christianとして
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.
print e
sys.exit(1)
指摘:
をあなたは例外を発生させる(例えば401権限)HTTPエラーをしたい場合は、あなたが
Response.raise_for_status
を呼び出すことができます。応答がhttpエラーの場合は、HTTPError
が返されます。
例:
try:
r = requests.get('http://www.google.com/nothere')
r.raise_for_status()
except requests.exceptions.HTTPError as err:
print err
sys.exit(1)
が印刷されます:
404 Client Error: Not Found for url: http://www.google.com/nothere
要求ライブラリの詳細を処理するための非常に良い答えと、一般的な例外をキャッチします。 –
下にあるurllib3ライブラリのバグのため、タイムアウトを使用している場合は、 'socket.timeout'例外も捕捉する必要があります:https://github.com/kennethreitz/requests/issues/1236 –
未来コメントリーダー:これはRequests 2.9で修正されました(urllib3 1.13がバンドルされています) – RazerM
明示される1つの追加の提案を。特定のエラーが捕捉されるように、エラーのスタックを特定のものから一般的なものにするのが最善のようです。そのため、特定のエラーは一般的なものによってマスクされません。
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
print ("Timeout Error:",errt)
OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah
ありがとう@jouell、言及する価値がある非常に良い点。私はあなたのコードに小さなタイプミスを修正するための編集を提案しました。 – Sam
@JonathonReinhartが完了対
。ありがとう –
https://raw.githubusercontent.com/kennethreitz/requests/master/requests/exceptions.py –