try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
これは正しいです?これを構成するためのより良い方法はありますか?これは私のすべての基地をカバーするでしょうか?
Requests exception docs を見てください。要するに:
ネットワークの問題(DNSの失敗、接続の拒否など)が発生した場合、リクエストは
ConnectionError
例外を発生させます。まれに無効なHTTP応答が発生した場合、Requestsは
HTTPError
例外を発生させます。リクエストがタイムアウトすると、
Timeout
例外が発生します。リクエストが設定された最大リダイレクト数を超えると、
TooManyRedirects
例外が発生します。Requestsが明示的に発生させる例外はすべて
requests.exceptions.RequestException
から継承します。
あなたの質問に答えるために、あなたが示すものはnotすべての拠点をカバーするでしょう。あなたはタイムアウトに関するエラーではなく、接続関連のエラーのみを捉えるでしょう。
あなたが例外をキャッチしたときにすべきことは本当にあなたのスクリプト/プログラムの設計次第です。終了してもかまいませんか。続けてもう一度試すことができますか?エラーが壊滅的で、続行できない場合は、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)
あるいは、それらを別々に捕まえて別のことをすることもできます。
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)
として クリスチャン 指摘した:
Httpエラー(401 Unauthorizedなど)で例外を発生させたい場合は、
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
明示的にするための1つの追加の提案。特定のエラーから一般的なエラーへと移行し、目的のエラーを検出できるようにするのが最善のようです。したがって、特定のエラーが一般的なエラーによって隠されることはありません。
url='http://www.google.com/blahblah'
try:
r = requests.get(url,timeout=3)
r.raise_for_status()
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)
except requests.exceptions.RequestException as err:
print ("OOps: Something Else",err)
Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah
vs
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