プログラム実行時のエラー(例外:exception)に対処するためのコードを組み込んだtry文~except文について、今回はfinallyブロックの使い方について紹介します。
finallyブロックについて
例外が発生してもしなくても、最後に実行する処理を記述するブロックがfinallyブロックです。
以下が、書式となります。
1 2 3 4 5 6 7 8 | try : 例外が発生する恐れのある処理 ・・・ except 例外: 例外が発生したら実行する処理 ・・・ finally : 例外が発生してもしなくても最後に実行する処理 |
では、例を見てみましょう。
次の例は、運勢を占うようなプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | print ( "占い開始" ) fortunelist = [ "大吉" , "吉" , "大凶" ] #運勢のリスト try : input_value = int ( input ( "0~2のうち、好きな数字を入力してください:" )) print (fortunelist[input_value]) #fortunelist内の入力した数字番目の要素をprint()関数で出力 except ValueError : print ( "文字を入力しないでください!" ) except IndexError : #0~2以外の数字を入力すると例外が発生 print ( "0~2以外の範囲の数字は無効です。0~2の数字を入力してください!" ) finally : print ( "終了します" ) |
finallyブロックの話をする前に・・・
上記では、リストに入っている要素(上記例では、大吉等の運勢を表す文字列が各要素です)を参照しています。
リストに入っている要素を参照するには、
リスト名[インデックス番号]
の形で行います
インデックス番号は、リストの先頭から順番に0,1,2・・・のようになっています。
上記例だと、リストの要素は3つであり、インデックス番号は0~2までとなります。
fortunelist[0] で大吉
fortunelist[1] で吉
fortunelist[2] で大凶
となり、print()関数で出力しています。
なお今回は、インデックス番号をinput()関数で0~2の数を入力させることで得ています。
ですので、3以上の数字を入力すると、IndexErrorという例外が発生してしまいます。
IndexErrorに対する例外処理を11,12行目に記述しています。
※実は-3~-1という数字を入力してもエラーにならないのですが・・・インデックス番号についての詳細は、今後の記事で紹介します。
それでは、上記のプログラムを実行してみましょう。
※出力結果1
C:\Python> python 5-3-1.py
占い開始
0~2のうち、好きな数字を入力してください:1
吉
終了します
※出力結果2
C:\Python> python 5-3-1.py
占い開始
0~2のうち、好きな数字を入力してください:3
0~2以外の範囲の数字は無効です。0~2の数字を入力してください!
終了します
出力結果1は例外が発生していないパターン、出力結果2は例外が発生しているパターン(IndexError)になります。
どちらも、finallyブロックの処理(『終了します』という文字列を出力)が実行されています。
以上が、finallyブロックの説明でした。
まとめ
finallyブロックには、try文~except文で例外が発生してもしなくても最後に実行する処理を記述します。
確認問題
以下のような合計1万円の商品を複数人で購入する際に、1人当たり何円になるかを計算するプログラムがあります。
finallyブロックを追加してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 | sum = 10000 number_of_people_value = input ( "何人での購入ですか?" ) try : price = round ( sum / int (number_of_people_value)) print (price) except ValueError : print ( "文字を入力しないでください!" ) except ZeroDivisionError : print ( "人数を0にしないで下さい!" ) |
※以下が解答の一例になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | sum = 10000 number_of_people_value = input ( "何人での購入ですか?" ) try : price = round ( sum / int (number_of_people_value)) print (price) except ValueError : print ( "文字を入力しないでください!" ) except ZeroDivisionError : print ( "人数を0にしないで下さい!" ) finally : print ( "finallyブロックの追加" ) |