2011-08-11 18 views
17

なぜPythonのurllib2.urlopen()は正常なステータスコードのためにHTTPErrorを発行しますか? <a href="http://docs.python.org/howto/urllib2.html#httperror" rel="noreferrer">the urllib2 documentation</a>による

デフォルト・ハンドラは、100から299の範囲内のリダイレクト(300の範囲のコード)、およびコードを扱う成功を示しているので、あなたは通常は400から599の範囲にエラーコードが表示されます。

そして、まだ次のコード

request = urllib2.Request(url, data, headers) 
response = urllib2.urlopen(request) 

コード201(作成)してHTTPErrorを発生させます:

ERROR 2011-08-11 20:40:17,318 __init__.py:463] HTTP Error 201: Created 

なぜurllib2がこの成功の要求にHTTPErrorsを投げていますか?

痛みはあまりありません。私は簡単にコードを拡張することができます。

try: 
    request = urllib2.Request(url, data, headers) 
    response = urllib2.urlopen(request) 
except HTTPError, e: 
    if e.code == 201: 
     # success! :) 
    else: 
     # fail! :(
else: 
    # when will this happen...? 

しかし、これはドキュメントと、私はこの奇妙な振る舞いについて同様の質問を見つけることができないという事実に基づいて、意図した動作のように見えるしていません。

また、elseブロックは何を予期していますか?成功したステータスコードがすべてHTTPErrorと解釈された場合、いつは、urllib2ドキュメントのように通常のファイルのような応答オブジェクトを返しますか?urllib2.urlopen()は、

+0

それは201から299の間で応答コードを参照することは本当に珍しいです。 urllib2は完全にそれらを処理していません。 – Leopd

+1

何か不足していますか? 201はうまく動作します... – Santa

+0

@Santa、dcrostaの答えに従って非標準のハンドラを使用していますか? – rubergly

答えて

3

実際のライブラリのドキュメントが言及したよう:200のエラーコードについて

を、レスポンスオブジェクトがすぐに返されます。

200以外のエラーコードの場合、これはOpenerDirector.error()を介して、単にジョブをprotocol_error_codeハンドラメソッドに渡します。最終的に、urllib2.HTTPDefaultErrorHandlerは、他のハンドラがエラーを処理していない場合はHTTPErrorを送出します。

http://docs.python.org/library/urllib2.html#httperrorprocessor-objects

16

あなたはHTTErrorとして提起されることから、特定のエラーコードを防ぐためにurllib2で使用するカスタムHandlerクラスを記述することができます。ここで私が前に使用してきた一つだ:

class BetterHTTPErrorProcessor(urllib2.BaseHandler): 
    # a substitute/supplement to urllib2.HTTPErrorProcessor 
    # that doesn't raise exceptions on status codes 201,204,206 
    def http_error_201(self, request, response, code, msg, hdrs): 
     return response 
    def http_error_204(self, request, response, code, msg, hdrs): 
     return response 
    def http_error_206(self, request, response, code, msg, hdrs): 
     return response 

その後、あなたのようにそれを使用することができます:

opener = urllib2.build_opener(self.BetterHTTPErrorProcessor) 
urllib2.install_opener(opener) 

req = urllib2.Request(url, data, headers) 
urllib2.urlopen(req) 
+0

これらの場合、実際にどのように応答コードをチェックしますか? –

関連する問題