Remrinのpython攻略日記

python3に入門しました。python3についてあれこれとサンプルコードとか。

例外処理

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()で例外を表示できる。