例外処理
アプリケーションを作成する上で例外処理は欠かせません。是非とも覚えておきましょう。
簡単な使用例です。足し算を行うexception_test関数を用意し、それを呼び出しています。※関数の詳細は応用編で解説します。
# -*- coding: utf-8 -*-
def exception_test(value_1, value_2):
print u'====計算開始===='
result = 0
try:
result = value_1 + value_2
except:
print u'計算出来ませんでした!'
finally:
print u'計算終了'
return result
print exception_test(100, 200)
print exception_test(100, '200')
--実行結果--
====計算開始==== 計算終了 300 ====計算開始==== 計算出来ませんでした! 計算終了 0
関数が呼び出された後「try」配下の処理を行っています。その処理中にエラーが発生しなければ「except」配下の処理は実行されません。エラーが発生した時には必ず実行されるので、発生時の制御を細かく設定することもできます。
一回目の呼び出しの時の引数は両者ともに数値なので、except配下の処理は実行されていません。二回目の呼び出しの際の引数は片方が文字列ですので、足し算を実行することができずexcept配下の処理が実行される流れです。最後の「finally」はエラーの有無に関わらず必ず実行されるので、本来の使い方としてはオープンしたオブジェクトをクローズする処理などを記述すると良いでしょう。
規模が大きめアプリケーションを作成している場合、他のプログラマが作成した便利な関数を利用する機会は多々あると思います。その関数内で処理が収束してもよいのなら必要はありませんが、場合によっては呼び出し元にエラーを上げ、そのエラー処理を任せた方が良いケースもあります。
それを実現するのが「raise」です。
# -*- coding: utf-8 -*-
def exception_test(value_1, value_2):
print '====計算開始===='
result = 0
try:
result = value_1 + value_2
except:
print '計算出来ませんでした!'
raise
finally:
print '計算終了'
return result
try:
print exception_test(100, 100)
print exception_test(200, 200)
print exception_test(300, '300')
except:
print u'エラーを受け取りました'
--実行結果--
====計算開始==== 計算終了 200 ====計算開始==== 計算終了 400 ====計算開始==== 計算出来ませんでした! 計算終了 エラーを受け取りました
上記のサンプルは「try」の中で「try」を使用しているようなイメージです。「exception_test」でエラー発生時に「raise」するように記述しているので、それが呼び出し元の「try」の方へ伝播します。「raise」をコメントアウトすると26行目のexcept配下の処理が実行されないので、試してみてください。
処理を実行中にエラーが発生すると、エラー内容(スタックトレース)が標準出力へ出力されます。それをプログラム側で取得することも可能です。
# -*- coding: utf-8 -*-
import sys
import traceback
def exception_test(value_1, value_2):
print u'====計算開始===='
result = 0
try:
result = value_1 + value_2
except:
print u'計算出来ませんでした!'
raise
finally:
print u'計算終了'
return result
try:
print exception_test(100, '200')
except:
print '--------------------------------------------'
print traceback.format_exc(sys.exc_info()[2])
print '--------------------------------------------'
--実行結果--
====計算開始====
計算出来ませんでした!
計算終了
--------------------------------------------
Traceback (most recent call last):
File "test.py", line 27, in <module>
print exception_test(100,"200")
File "test.py", line 14, in exception_test
result = value_1 + value_2
TypeError: unsupported operand type(s) for +: 'int' and 'str'
--------------------------------------------
基礎編も佳境!インポート!
