try exceptをしっかり使う
やりたいこと
try except
による例外処理を行うときに、組み込みの例外クラス以外も扱いたい。
ちなみにtry except
の基本的な使い方はここにまとめられている。
具体的にどんな状況か?
twitter APIから情報取得をしている時にこんなエラーが発生してしまった
File "/home/mitsuzawa_kensuke/.local/lib/python2.7/site-packages/requests/sessions.py", line 468, in get
return self.request('GET', url, **kwargs)
File "/home/mitsuzawa_kensuke/.local/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
resp = self.send(prep, **send_kwargs)
File "/home/mitsuzawa_kensuke/.local/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
r = adapter.send(request, **kwargs)
File "/home/mitsuzawa_kensuke/.local/lib/python2.7/site-packages/requests/adapters.py", line 375, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url:
エラーを見るに、呼び出しているクラスのどこかでTimeoutエラーが発生したらしい。
raise ConnectionError(e, request=request)
とあるので、定義された例外クラスだとわかる。
で、そのクラス名はrequests.exceptions.ConnectionError
であることも書いてある。
ここで、このエラーが発生するときだけ例外処理を実行したい。
さて、どう記述するか?
解決法
まず、この例外クラスを読み込む。
つまり、
from requests.exceptions import ConnectionError
もしくは
from requests.exceptions import *
でも良いが、余計なもの以外は読み込まない。という設計思想的にはよろしくないだろう。
例外クラスを読み込んだ上で、
except ConnectionError:
例外処理
と記述する。
当たり前であるが、すでに読み込みずみなので、requests.exceptions
の部分は記述しなくていい。
requests.exceptions.ConnectionError
とか書くと、「requestsが未定義です」的なエラーが出る。