Python 例外と例外処理 #1

株式会社リュディアです。今回からPython の例外と例外処理についてまとめてみます。

まず例外という言葉についてです。例外は実行中に発生した設計段階で想定していない問題と考えてください。

今回は例外処理についてのまとめなので例外処理の方法について言及しますが、例外を必ず処理する必要もありません。Python で例外が発生すると呼び出し元に責任を戻すという動きをとります。たとえばライブラリ関数で引数が整数であるという仕様があるにも関わらずユーザーが文字列を渡した場合の例外処理を、ライブラリ開発者が行うべきなのかどうか、というと賛否両論あると思います。例外はどこまでどこが処理するかという課題と常に向き合わせになると考えています。このあたりの感覚は徐々に身についてくると思います。最初にこのようなことを書いたのは本まとめは例外と例外処理の方法についてのものであって何を例外とするか、どの例外に対して処理すべきかについては言及していない、ということを書きたかったためです。ここまでご理解いただいた上でさっそく具体的な例を見ていきましょう。

Python の例外は組み込み例外ユーザー定義例外にわけることができます。組み込み例外は Python 自体が提供しているものであり、ユーザー定義例外はユーザーが定義した例外です。

まず最初は組み込み例外、特に具象例外 (Concrete Exception) に分類されるものについてです。Python はどのような例外をサポートしているのでしょうか?すべての具象例外を確認するには以下のリンクを見てください。ここでは有名な例外として 0 で除算を行った際に発行される ZeroDivisionError を例として扱います。

ZeroDivisionError は算術演算で除算や剰余除算で除数が 0(ゼロ)になった場合に発生する例外です。ちなみに Python の例外の型はすべて例外型であることに注意してください。では以下の例をみてください。

l_div = [2, 5, 3, 0, 4]
a = 10
for i in l_div:
   print(a, i, a/i)

# 10 2 5.0
# 10 5 2.0
# 10 3 3.3333333333333335
# ---------------------------------------------------------------------------
# ZeroDivisionError                         Traceback (most recent call last)
# <ipython-input-8-e5f52a00b60c> in <module>
#       2 a = 10
#       3 for i in l_div:
# ----> 4     print(a, i, a/i)
# 
# ZeroDivisionError: division by zero

a = 10 をリスト l_div の要素で順に除算を実行するプログラムです。最初の 3 つの要素については 10/2 = 5.0, 10/5 = 2.0, 10/3 = 3.333... と実行されていますが、4つ目の要素が 0 なので 0 による除算が行われエラー = 例外が発生します。実際、ZeroDivisionError と表示されていますね。

発生することはわかったので発生した場合にプログラムがどのように動作すべきか記述するためにはどうすればよいのでしょうか?例えば、以下のようにプログラムを記述することも方法の 1 つです。

l_div = [2, 5, 3, 0, 4]
a = 10
for i in l_div:
   if (i == 0):
       continue
   else:
       print(a, i, a/i)

# 10 2 5.0
# 10 5 2.0
# 10 3 3.3333333333333335
# 10 4 2.5

除数が 0 であるかを if 文で確認し除数が 0 である場合には処理を行わずループ先頭に戻り次の要素に進める、としています。これも 1 つの方法です。次に例外を使った方法を記載してみます。

l_div = [2, 5, 3, 0, 4]
a = 10
for i in l_div:
   try:
       print(a, i, a/i)
   except ZeroDivisionError:
       print('Zero division exception')

# 10 2 5.0
# 10 5 2.0
# 10 3 3.3333333333333335
# Zero division exception
# 10 4 2.5

try 節と呼ばれる構文を使います。try ... except で囲まれた部分で例外をモニターし発生した場合には except 節で例外を取得できます。この例の出力を見てもらえば除数が 0 になったときのみ except 節が実行されていますね。

今回は簡単な例として ZeroDevisionException を使って try ... except についてまとめました。

Python の例外と例外処理に関するまとめの続きは以下からどうぞ。

では、ごきげんよう。


この記事が気に入ったらサポートをしてみませんか?