演習課題「例外の種類を変更しよう その2」
右のコードでは、RPGの勇者の行動を3行表示します。
しかし、未定義の変数number2を呼び出しているため例外が発生するのですが、補足する例外が異なるため、プログラムが強制終了してしまいます。
このプログラムにexceptブロックを追加して、未定義の変数を呼び出した場合の例外を補足してください。追加したブロックでは、標準エラー出力に下記のメッセージを表示してください。
プログラムを実行して、想定どおり出力されれば演習課題クリアです!
期待する出力値
勇者は敵に遭遇した
勇者は勝利した
期待する標準エラー出力値
未定義の変数を呼び出しています
#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