はじめに
今回は例外処理を扱います。例外処理とは、エラーが起きた時の処理をあらかじめ定めておくことです。文法的に正しいコードを書いていても、実行時にエラーが起こることがあります。実行時のエラーを検出して、処理するにはtry, exceptを使います。
例外処理
早速、確認していきましょう。まずはじめに次のように、2つの数字があたえられたときに、割り算した結果を返す関数を定義しておきましょう。
# 2つの与えられた数字で割り算をおこない結果を返す関数
def calc_div(a,b):
return a/b
ここでたとえば、a=8, b=3であれば次のようになります。
a=8
b=3
calc_div(a,b)
ちゃんと計算できていますね。では、次に、a=8, b=’3’とするとどうでしょう?
a=8
b='3'
calc_div(a,b)
数字が入力されるはずのところに文字列である「’3’」が来たためTypeErrorが起きています。このエラーの例外処理をしてみましょう。
例外処理ではtry, exceptを使います。まず、エラーが起きる可能性がある部分をtry文の中に入れます。次に、try文の中でエラーが起きた時に何をするか、をexcept文の部分に書きます。
try:
calc_div(a,b)
except Exception as e:
print('計算できません')
print(e)
どうでしょうか?今度はエラーが起きません。これは、try文の中でエラーをキャッチしているためで、そのエラーが起きた時の処理としてexcept文に書かれた「計算できません」を出力しています。さらに、その下に記載しているprint(e)の部分では、実際に起こったエラーの内容を確認することができます。
except文に記載したExceptionは、基底クラスのExceptionと呼ばれるものです。システム終了(SystemExit
, KeyboardInterrupt
など)以外のすべての組み込み例外の基底クラスであるException
を指定することができます。このようにすべての例外をキャッチして同じ処理をするのではなく、例外ごとに処理を分けたいときには、次のようにします。
except 例外型 as 変数名:
a=8, b=’3′ ではTypeErrorが起きていましたね。そこで、excep文のところでTypeErrorを指定してみましょう。数字以外が入力されていることがわかっているので、今度はメッセージも変えてみましょう。
try:
output=calc_div(a,b)
print(output)
except TypeError:
print('数字を入力してください')
うまくいきました。b=0 のように0で除算をしてしまうエラーも起こりえます。先ほどのExceptionで「計算できません」のような処理でもよいですが、TypeErrorと0除算のエラーで処理を分けたければ、次のようにします。
try:
output=calc_div(a,b)
print(output)
except TypeError:
print('数字を入力してください')
except ZeroDivisionError:
print('0で割っています')
このようにしておくと、数字以外が入力されたTypeErrorのときの処理と0で割ったときの処理を分けることができます。
finallyを追加すると、エラーの発生有無に関わらず処理させることができます。
try:
output=calc_div(a,b)
print(output)
except TypeError:
print('数字を入力してください')
except ZeroDivisionError:
print('0で割っています')
finally:
print('処理を終了します')
こうすると、
- 正常処理された場合は、計算結果+「処理を終了します」
- TypeErrorの場合は、「数字を入力してください」+「処理を終了します」
- ZeroDivisionErrorの場合は、「0で割っています」+「処理を終了します」
のように表示することができます。
まとめ
いかがでしたか?今回は例外処理を扱いました。例外処理を使うことで、エラーが発生しても実行が中止されずにそれ以降の処理をおこなうことできます。是非、この考え方を身に着けておきましょう。
コメント