レッスン4 / 6問目

『exceptで複数の例外を受け取ろう』

このレッスンではexceptで複数の例外を受け取る方法について見ていきましょう。

複数の例外を受け取る

では、複数の例外を受け取る方法について見ていきましょう。
複数の例外を受け取るには以下のようにexceptを複数記述します。

try:     例外処理の対象とするコード except 例外1:     処理 except 例外2:     処理

具体例を見ていきましょう。
以下の例ではIndexErrorとZeroDivisionErrorをexceptでキャッチしています。
また、7, 10行目に「ZeroDivisionError as e」「IndexError as e」という記述がありますが、これは例外の内容を変数eに代入するコードです。

  1. a = []
  2. try:
  3.     b = 2 / 0    # ZeroDivisionError
  4.     a[0]    # IndexError
  5. except ZeroDivisionError as e:
  6.     print(e)
  7. except IndexError as e:
  8.     print(e)
division by zero

上記の例では4行目のb = 2 / 0の部分でZeroDivisionErrorが発生し、7行目のexceptが例外をキャッチしています。キャッチした例外の内容は変数eに代入され、そのeを出力しています。ちなみにeは例外が発生した際に出力されるメッセージの以下赤枠部分です。

Traceback (most recent call last): File "main.py", line 2, in <module> b = 2 / 0 ZeroDivisionError: division by zero

また、5行目も例外が発生するコードですが、4行目で例外が発生しているためそこで処理がストップしています。つまり、例外処理では例外が発生した場合にはそれ以降の処理は実行されず、exceptに処理が移るということです。


もう一つ例を見ていきましょう。

以下は上記のコードとほとんど同じ内容ですが、4行目のコードで例外が発生しないように変更されています。この場合、5行目のコードで例外が発生し、10行目のexceptが例外をキャッチしています。

  1. a = []
  2. try:
  3.     b = 2 / 1    # 例外は発生しない
  4.     a[0]    # IndexError
  5. except ZeroDivisionError as e:
  6.     print(e)
  7. except IndexError as e:    # 例外をキャッチ
  8.     print(e)
list index out of range


すべての例外を受けとる

また、exceptに例外を指定しない場合、全ての例外を受け取ることができます。

  1. a = []
  2. try:
  3.     b = 2 / 0    # ZeroDivisionError
  4.     a[0]    # IndexError
  5. except:
  6.     print("例外発生!")
例外発生!

このようにexceptに例外を指定しない場合全ての例外を受け取ることができますが、その場合、全ての例外をキャッチするため、想定していなかったエラーが発生した場合にそのエラーを見つけづらくなります。そのためexceptで全ての例外をキャッチする場合は注意しましょう。


Lesson1

exceptを用いて、ZeroDivisionErrorをキャッチしそのエラーの内容を出力するコードを記述してください。

Lesson2

exceptを用いて、TypeErrorをキャッチしそのエラーの内容を出力するコードを記述してください。

Last updated:2019/12/19

division by zero
  1. try:
  2. print(3 / 0) # ZeroDivisionErrorが発生する
  3. print(1 + "hoge") # TypeErrorが発生する
  4. except ZeroDivisionError as e:
  5. print(e)
  6. except TypeError as e:
  7. print(e)
main.py
設定
g
n
i
d
a
o
L