例外処理
pythonの例外処理について。
例外が発生すると例外オブジェクトを作る。
すべての例外オブジェクトはExceptionクラスを継承している。
基本形は
try: 処理 except: 例外発生時の処理
例外処理の書式
except | すべての例外を捕捉 |
except 例外クラス名 | 捕捉する例外を指定 |
except 例外クラス名 as ~ | 捕捉する例外を指定し、変数に代入 |
else | 例外が発生しなかった時の処理 |
finally | 例外の有無にかかわらず行う処理 |
例外のクラス指定はサブクラスまで含めて判定
・エラーが捕捉されなかった場合は、トレースバックを表示。
・例外処理のメリット
エラーの発生位置とエラー処理を分離できる。
・tryブロックはできるだけ短くする。
長いコードを記述すると、意図せぬ部分からの例外をとらえてしまう。
・tryブロックから呼び出された関数の例外もとらえる。
raise
・自作のクラスなどでは、意図的に例外を発生させることができる。
# dictクラスを継承し、strだけキーにできるようにする class StrDict(dict): def __setitem__(self, key, value): if not isinstance(key, str): raise ValueError("Key must be str.") super().__setitem__(key, value) d1 = StrDict() #d1[0] = 0 # ValueError: Key must be str.
既存の例外クラスを継承して、独自の例外クラスを作れる。
tracebackモジュール
例外発生時のトレースバックを操作でき、例外が発生しても処理を続けられる。
import traceback d1 = {1:"Jan", 2:"Feb", 5:"may"} err = [] for i in range(6): try: print(d1[i]) except: err.append(traceback.format_exc()) # 例外を文字列として保持 print(len(err)) #print(err) # エラー内容を確認するとき表示 # Jan # Feb # may # 3
traceback.print_exc()で例外を表示できる。