リンク
ちゃんと調べるときは
http://www.python.jp/doc/release/
Wiki内検索
最近更新したページ
最新コメント
文字コードの判定 by awesome things!
正規表現 by awesome things!
辞書 by stunning seo guys
文字列の16進変換 by check it out
文字コードの変換 by check this out
デバッガ by check this out
サブプロセス by watch for this
文字コードの判定 by watch for this
サニタイジング by check this out
タグ

例外処理

何でもかんでも捕まえる

>>> 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番目の項目にも何かセットしたい場合は以下。二つ指定する。引数は3つ必要らしい。

>>> 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_




スマートフォン版で見る