2017-05-05 7 views
1
try: 
    response = urllib2.urlopen(request) 
except urllib2.URLError as e: 
    response = json.loads(e.read()) 
    return error(e.code(),response['errors'][0]['message']) 
response = json.loads(response.read()) 
if 'errors' in response: 
    return error(response['ErrorCode'],response['Error']) 

ここでは、私が作業しているコードを示します。この記事を参考にしてください。正確に 'e'とは何ですか?e.code()やe.read()は何をしますか?

答えて

2

eがキャッチされた例外であり、ここではurllib2.URLErrorクラスまたはそのサブクラスのインスタンスです。このコードでは、そのインスタンスがe.read()e.code()のメソッドを定義すると想定しています。

ただし、若干の誤差があります。実際にはURLErrorというサブクラスであるurllib2.HTTPError exceptionを捕捉していると仮定しています。例外ハンドラは確かにそのような例外をキャッチしますが、URLErrorのベースにもなります。その場合はe.read()メソッドはありません!また、メソッドではなく属性であるHTTPError.codeを呼び出そうとします。

HTTPError HTTPエラーコードでは例外がスローされるため、サーバーからの応答があった場合にのみ例外がスローされます。 e.read()はソケットからレスポンス本文を読み取り、e.codeはサーバーが応答したHTTPコードです。ドキュメントから:

例外(URLErrorのサブクラス)であることけれども、HTTPErrorは、非例外的なファイルのような戻り値(同じことurlopen()戻っている)として機能することができます。これは、認証要求など、エキゾチックなHTTPエラーを処理する場合に便利です。すべてのケースで動作するコードの場合

、それはに補正しなければならないであろう:HTTPレスポンスを含まないエラーを処理するための追加except urllib2.URLError as e:ブロックと、おそらく

try: 
    response = urllib2.urlopen(request) 
except urllib2.HTTPError as e: 
    response = json.loads(e.read()) 
    return error(e.code, response['errors'][0]['message']) 

+0

は 'response ['errors'] [0] ['message']'私のコードと一意であるか、それとも特別な機能を果たしますか?それはe.message()やe.reason()のようなものに置き換えられますか? – deepanshpahwa

+0

@deepanshpahwa:応答本体からロードされていることに注意してください。これはコードが接触する* HTTPサーバーに固有です。 'e.read()'はサーバレスポンスを読み取り、JSONドキュメントとしてデコードされます。これはリストである '' errors''キーを持つ辞書になると予想されます。 –

+0

説明ありがとうございます。 素晴らしい一日を過ごしましょう。 – deepanshpahwa

関連する問題