Python のお勉強3 ( 例外処理 )
「Python のお勉強シリーズ」第3回目です。今回は例外処理についてサンプルコード書いてみました。
■ Except.py
#coding: cp932 import sys, traceback def test(): print("test()") def testexcept(): raise Exception("hoge", "uga") if __name__ == "__main__": print("-----call test()-----") try: test() except: print("except") else: print("else") #try 句で例外が発生しない場合、else 句が実行される finally: print("finally") print("-----call testexcept() 1-----") try: testexcept() except Exception as e: print("except") print("type:", type(e)) #例外の型が取得できる "<class 'Exception'>" print("e:", e) #引数が取得できる traceback.print_exc(file=sys.stdout) #(*1) else: print("else") #try 句で例外が発生した場合、else 句は実行されない finally: print("finally") #try 句で例外が発生した場合も、finally 句は実行される print("-----call testexcept() 2-----") try: testexcept() except BaseException as e: #基底クラスでキャッチすることも可能 #(*2) print("except") print("type:", type(e)) #型については実際の例外クラスが入る "<class 'Exception'>" print("e:", e) else: print("else") finally: print("finally")
■ 実行結果
-----call test()----- test() else finally -----call testexcept() 1----- except type: <class 'Exception'> e: ('hoge', 'uga') Traceback (most recent call last): File "Except.py", line 24, in <module> testexcept() File "Except.py", line 9, in testexcept raise Exception("hoge", "uga") Exception: ('hoge', 'uga') finally -----call testexcept() 2----- except type: <class 'Exception'> e: ('hoge', 'uga') finally
例外処理は try ~ except ( ~ else ~ finally ) を使って記述します。try ブロックに書いた処理で例外が発生した場合、except でキャッチされるという感じみたいです。try ブロックで例外が発生しなかった場合は else に書いた処理が実行されます ( 例外が発生した場合は実行されない )。finally はどちらにせよ実行される感じ。
as 使うと例外オブジェクトが取得できるみたいです。ここはあまり調べられてませんが、例外オブジェクトには発生した例外の型とかメッセージ等々の情報があるみたいですね。
スタックトレースは (*1) のような書き方すると取得できるみたいです。traceback モジュールのインポートが必要になりますが、詳しくは以下のドキュメントに。
・29.9. traceback — スタックトレースの表示または取得 — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/traceback.html
で、上記だと (*2) の箇所になりますが、基底クラスで例外をキャッチすることもできるようです。
※ BaseException は全ての組み込み例外の基底クラスになります。
・5. 組み込み例外 — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/exceptions.html
上記以外にも、複数の例外のキャッチとかいろいろありそうですが、ひとまず、以上とします。