例外処理
何でもかんでも捕まえる
>>> import sys >>> import traceback >>> try: ... a = 1 / 0 ... except: ... print "exc_info: %s" % str(sys.exc_info()) ... print "[0]: %s" % sys.exc_info()[0] ... print "[1]: %s" % sys.exc_info()[1] ... traceback.print_tb(sys.exc_info()[2]) ... exc_info: (<class exceptions.ZeroDivisionError at 0x83267f4>, <exceptions.ZeroDivisionError instance at 0x8345104>, ^<traceback object at 0x834674c>) [0]: exceptions.ZeroDivisionError [1]: integer division or modulo by zero File "<stdin>", line 2, in ? >>>
特定のものを捕まえる
>>> try: ... a = 1 / 0 ... except ValueError, NameError: ... print "exception occurred." ... except ZeroDivisionError: ... print "Illegal division by zero." ... Illegal division by zero. >>>
トレースバックの取得
>>> try: ... a = 1 / 0 ... except ZeroDivisionError: ... traceback.print_exc(file=sys.stdout) ... print "----------" ... raise ... Traceback (most recent call last): File "<stdin>", line 2, in ? ZeroDivisionError: integer division or modulo by zero ---------- Traceback (most recent call last): File "<stdin>", line 2, in ? ZeroDivisionError: integer division or modulo by zero >>>
else
例外にならないときだけ処理することを書く。
トラップしたい例外が起こるところだけをtryブロックに書く。
>>> >>> try: ... print "no exception" ... except: ... traceback.print_exc(file=sys.stdout) ... else: ... print "exception not occurred." ... no exception exception not occurred. >>>
finally
例外になろうがなるまいが処理することを書く。
>>> >>> try: ... print 1 / 0 ... finally: ... print "a" ... a Traceback (most recent call last): File "<stdin>", line 2, in ? ZeroDivisionError: integer division or modulo by zero >>>
ユーザー定義の例外
例外オブジェクト(?)の中身(?)
>>> try: ... hash = {} ... print hash['ABCDE'] ... except: ... print "0: %s" % sys.exc_info()[0] ... print "1: %s" % sys.exc_info()[1] ... traceback.print_tb(sys.exc_info()[2]) ... 0: exceptions.KeyError 1: ABCDE File "<stdin>", line 3, in ? >>>
名前だけ指定して発生させた場合
>>> try: ... raise "1234567" ... except: ... ... print "0: %s" % sys.exc_info()[0] ... print "1: %s" % sys.exc_info()[1] ... traceback.print_tb(sys.exc_info()[2]) ... 0: 1234567 1: None File "<stdin>", line 2, in ? >>>
2番目の項目にも何かセットしたい場合は以下。二つ指定する。
>>> try: ... raise "1234567", 'acbde' ... except: ... print "0: %s" % sys.exc_info()[0] ... print "1: %s" % sys.exc_info()[1] ... traceback.print_tb(sys.exc_info()[2]) ... 0: 1234567 1: acbde File "<stdin>", line 1, in ? >>>
2010年01月25日(月) 12:44:16 Modified by hebi_