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'])
。
は 'response ['errors'] [0] ['message']'私のコードと一意であるか、それとも特別な機能を果たしますか?それはe.message()やe.reason()のようなものに置き換えられますか? – deepanshpahwa
@deepanshpahwa:応答本体からロードされていることに注意してください。これはコードが接触する* HTTPサーバーに固有です。 'e.read()'はサーバレスポンスを読み取り、JSONドキュメントとしてデコードされます。これはリストである '' errors''キーを持つ辞書になると予想されます。 –
説明ありがとうございます。 素晴らしい一日を過ごしましょう。 – deepanshpahwa