VOOZH about

URL: https://paiza.jp/works/python3/primer/beginner-python10/7604

⇱ Python入門編10:複数の例外を捕捉してみよう | プログラミング学習サイト【paizaラーニング】


演習課題「例外の種類を変更しよう その2」

右のコードでは、RPGの勇者の行動を3行表示します。
しかし、未定義の変数number2を呼び出しているため例外が発生するのですが、補足する例外が異なるため、プログラムが強制終了してしまいます。
このプログラムにexceptブロックを追加して、未定義の変数を呼び出した場合の例外を補足してください。追加したブロックでは、標準エラー出力に下記のメッセージを表示してください。

プログラムを実行して、想定どおり出力されれば演習課題クリアです!

期待する出力値

勇者は敵に遭遇した
勇者は勝利した

期待する標準エラー出力値

未定義の変数を呼び出しています

※paizaに会員登録すると無料で動画学習コンテンツをご利用いただけます
会員登録する

#05:複数の例外を捕捉してみよう

ここでは、複数の種類の例外に対応する方法を学習します。tryブロック内で発生する可能性のある複数の例外に対応できるよう、プログラムを改良していきましょう。

print(1)
try:
number = 0
answer = 100 / number
print(answer2)
except Exception as e:
print("予期せぬエラーが発生しました")
print(e)
except ZeroDivisionError as e:
print("0では割り算できません")
print(e)
except NameError as e:
print("未定義の変数を呼び出しています")
print(e)
finally:
print(2)

動画では、Exceptionクラスは、全ての例外クラスのスーパークラスと説明しました。
ただ、Exceptionは、BaseExceptionクラスを継承しているので、全ての例外クラスのスーパークラスは、「BaseException」となります。
BaseExceptionを継承していて、Exceptionを継承していない例外は、技術的な例外です。
技術的な例外が発生した場合は、原則、プログラムを終了させる必要があるため、意図的に捕捉しないようにします。
そのため、みなさんが全ての例外を捕捉したい時は、「Exception」を使うようにします。

Pythonの例外クラスには、動画で紹介したクラス以外にも、たくさんあります。
また、ZeroDivisionErrorは、Exceptionのサブクラスと紹介しましたが、正しい継承関係は下記の通りになります。

BaseException
+-- Exception
+-- ArithmeticError
+-- ZeroDivisionError

Pythonで用意されている例外クラスは、下記URL先を参照ください。

組み込み例外 — Python 3.6.5 ドキュメント
https://docs.python.jp/3/library/exceptions.html#exception-hierarchy