2013/04/01

Pythonの例外処理

Pythonにおける例外処理について説明してみたいと思います。

Pythonでは、例外処理の「try catch」のロジックは「try~except」で実現することができます。

以下、最も基本的な使い方から順にいくつか発展形を見ていきます。

try - except

try:
    f = open('sample.txt', 'r')
except:
    print 'cannot open sample.txt'
tryのブロックの中にある処理を行なって、例外(エラー)が発生したらexceptの方の処理へと移ります。

例外が発生しなかった場合は、exceptのブロックはパスしてtry後の手続きへと進んでいきます。


try - except ExceptionName

try:
    f = open('sample.txt', 'r')
except IOError:
    print 'cannot open sample.txt'
エラーの種類を限定して例外処理を行いたい場合は、exceptの後に例外のクラス名を渡します。上の場合ですと、入出力に関わるIOErrorのみをキャッチします。


try - except ExceptionName, var

try:
    f = open('sample.txt', 'r')
except Exception, e:
    print e, 'error occurred'
exceptで捉えたエラーがどんなエラーだったのか確認したい場合は、「exept 例外名, 変数名」とすると、渡した変数にエラーの名前が入ります。上の場合ですと、eの部分にエラー名が入ります。


try - except - else

try:
    f = open('sample.txt', 'r')
except:
    print 'cannot open sample.txt'
else:
    lines = f.readlines()
elseブロックをつけると、例外が発生しなかった場合にだけ行いたい処理を指定することができます。


try - except - finally

try:
    f = open('sample.txt', 'r')
except:
    print 'cannot open sample.txt'
finally:
    f.close()
finallyブロックをつけると、例外が発生してもしなくても、いずれの場合でも共通で行う処理を指定することができます。

finallyは基本的にtry~exceptの処理の最後に実行されるようです。ただ、tryのブロックの中で例外が発生したのにそれががどのexceptでもキャッチされなかった場合には、少し複雑な流れになるようです。finallyを正しく使うには公式のドキュメントなどを参照したうえで使うのがよいかと思います。

また、例外を正しく扱うには、どういった種類の例外があるのか、事前に調べておくのがよいかと思います。そちらのチェックも公式ドキュメントがおすすめです。

以上です。


例外処理に関しては、次のようにPEP20 Zen of Pythonでも言及されています。
Errors should never pass silently.
Unless explicitly silenced.
このあたり、Pythonの言語設計のベースの考え方とも直結しているみたいです。


参考
エラーと例外 - Python公式ドキュメント
例外の種類 - Python公式ドキュメント

0 件のコメント: