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

これは間違いありませんか?これを構造化するより良い方法はありますか?これは私のすべての基地をカバーするだろうか?Pythonリクエストモジュールを使用する以外は試してみてください。

+1

@JonathonReinhartが完了対

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 

。ありがとう –

+2

https://raw.githubusercontent.com/kennethreitz/requests/master/requests/exceptions.py –

答えて

372

リクエスト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 
+6

要求ライブラリの詳細を処理するための非常に良い答えと、一般的な例外をキャッチします。 –

+7

下にあるurllib3ライブラリのバグのため、タイムアウトを使用している場合は、 'socket.timeout'例外も捕捉する必要があります:https://github.com/kennethreitz/requests/issues/1236 –

+4

未来コメントリーダー:これはRequests 2.9で修正されました(urllib3 1.13がバンドルされています) – RazerM

14

明示される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 
+0

ありがとう@jouell、言及する価値がある非常に良い点。私はあなたのコードに小さなタイプミスを修正するための編集を提案しました。 – Sam

関連する問題