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


上記以外にも、複数の例外のキャッチとかいろいろありそうですが、ひとまず、以上とします。

[ 環境情報 ]
Windows 7 SP1
Python 3.4.3