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が未定義です」的なエラーが出る。

参考