web-dev-qa-db-ja.com

Pythonリクエストモジュールを使用する以外は/を試す正しい方法は?

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

これは正しいです?これを構成するためのより良い方法はありますか?これは私のすべての基地をカバーするでしょうか?

287
John Smith

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
563

明示的にするための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
42
jouell