【Python入門・応用講座】14.例外処理|エラーや例外のときでもプログラムを実行する方法(初心者にもわかりやすく)

こんにちは。キノコードです。
この動画では、Pythonの例外処理について説明します。

Pythonにおけるエラー

まず、Pythonにおけるエラーについて説明します。
Pythonのプログラム実行中に検出されるエラーには大きく分けて二つあります。
一つは構文エラーです。
構文エラーはコードが文法的に間違っているときに発生します。
例えば、:(コロン)を書いてなかったり、括弧を閉じていない場合などに発生します。
もう一つは例外です。
例外はコードが文法的に正しかったとしても、実行するうえで不具合があるときに発生します。
例外が発生したときにどのように対処するかを書く記法が例外処理です。
例外処理が書いてない場合は、例外が発生するとプログラムは停止してしまいますが、
例外処理が書いてある場合は、例外が発生すると例外処理の通りにプログラムを実行できます。

たとえば、例外が発生するコードを書いてみましょう。

a = 2
b = 0

print("Start!!")
print(a / b)
print("Finish!!")

変数aに2を代入し、変数bに0を代入します。
まず、「Start!!」と表示します。
次にaをbで割った結果を表示します。
最後に「Finish!!」と表示してみましょう。
実行します。
bは0が代入されているため割り算できず、例外の一つであるZeroDivisionErrorが発生しました。
それによってプログラムが停止し、最後の「Finish!!」は表示されていません。
例外処理を書くと、このようなエラーが発生したときの表示を変更したり、次のプログラムを実行させることもできます。
このレッスンで例外処理について学んでいきましょう。

try ~ except文

まず、try ~ except文について説明します。
try ~ except文では、tryの後に実行したいコードを書き、exceptの後に例外処理を書きます。
まず、try、そして:(コロン)を書きます。
インデントを下げて、エラーが発生する可能性のあるコードを書きます。
次に、except、そして:(コロン)を書きます。
インデントを下げて、エラーが発生したときの処理を書きます。
これで完成です。
このように書くと、まずtryの中のコードが実行されます。
そしてエラーが発生すると、exceptの中のコードが実行されます。
具体例で確認してみましょう。

a = 2
b = 0

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")

先ほどと同じように、変数aに2を代入し、変数bに0を代入します。
そして、try、:(コロン)を書きます。
インデントを下げて、「Start!!」と表示します。
そして、aをbで割った結果を表示します。
次にexcept、:(コロン)を書きます。
インデントを下げて、「0除算エラーです」と表示します。
結果を確認してみましょう。
実行します。
先ほどはエラーメッセージが表示されましたが、今回は表示されていません。
このプログラムは次の順で実行されます。
まず、tryの中の「Start!!」が表示されます。
次にaをbで割った結果を表示しようとしますが、割り算できずにエラーが発生します。
そのため、exceptの中の「0除算エラーです」が表示されます。

また、bに0以外の数値が代入されていればエラーは発生しません。
そのときはtryの中のコードだけが実行されて終了します。

a = 2
b = 1

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")

bに1を代入して結果を確認してみましょう。
実行します。
結果が表示されました。
エラーが発生していないので、exceptの中のコードは実行されていません。

try ~ except ~ else文

次に、try ~ excpet文のelseについて説明します。
try ~ except文の後にelseを書くと、エラーが発生せずにtry文のプログラムが正常に終了した後の処理を書けます。
エラーが発生した場合はelseの中のコードは実行されません。
書き方はelse、そして:(コロン)を書きます。
インデントを下げて、プログラムが正常に終了した後の処理を書きます。
具体例で確認してみましょう。

a = 2
b = 0

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")
else:
    print("エラーは発生しませんでした")

変数aに2を代入し、変数bに0を代入します。
先ほどと同様のコードを書き、後ろにelse、そして:(コロン)を書きます。
インデントを下げて「エラーは発生しませんでした」と表示します。
結果を確認してみましょう。
実行します。
結果が表示されました。
エラーが発生したためexceptの中のコードが実行され、elseの中のコードは実行されていないことがわかります。

a = 2
b = 1

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")
else:
    print("エラーは発生しませんでした")

今度はbに1を代入して、同じコードを実行してみましょう。
実行します。
今度はエラーが発生しなかったため、exceptの中のコードは実行されず、elseの中のコードが実行されていることがわかります。

try ~ except ~ else ~ finally文

次に、try ~ excpet文のfinallyについて説明します。
try ~ except文の後にfinallyを書くと、エラーが発生してもしなくても、try文のプログラムが終了した後の処理を書けます。
書き方はfinally、そして:(コロン)を書きます。
インデントを下げて、プログラムが終了した後の処理を書きます。
具体例で確認してみましょう。

a = 2
b = 0

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")
else:
    print("エラーは発生しませんでした")
finally:
    print("Finish!!")

変数aに2を代入し、変数bに0を代入します。
先ほどと同様のコードを書き、後ろにfinally、そして:(コロン)を書きます。
インデントを下げて「Finish!!」と表示します。
結果を確認してみましょう。
実行します。
結果が表示されました。
エラーが発生したため、exceptの中のコードが実行され、elseの中のコードは実行されていません。
そして、最後にfinallyの中のコードが実行されていることがわかります。

a = 2
b = 0

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")
else:
    print("エラーは発生しませんでした")
finally:
    print("Finish!!")

今度はbに1を代入して、同じコードを実行してみましょう。
実行します。
今度はエラーが発生しなかったため、exceptの中のコードは実行されず、elseの中のコードが実行されています。
そして、最後にfinallyの中のコードが実行されていることがわかります。

例外処理の場合分け

次に、例外処理の場合分けについて説明します。
今まで書いてきたように、exceptの直後に:(コロン)を書くと全てのエラーを処理します。
従って、数値を文字列で割り算するような型の違いによるエラーも同じ処理になります。
具体例で確認してみましょう。

a = 2
b = "2"

try:
    print("Start!!")
    print(a / b)
except:
    print("0除算エラーです")

変数aに2を代入し、変数bに文字列の2を代入します。
先ほどと同様のコードのexceptの中のコードまでを書き、結果を確認してみましょう。
実行します。
このように、数値を文字列で割り算したことによるエラーに対しても「0除算エラーです」と表示されてしまいます。
exceptの後にエラー名を書くと、発生するエラーの種類によって処理を分けられます。
それでは、0除算エラーの場合とデータ型エラーの場合で処理を分けてみましょう。

a = 2
b = "2"

try:
    print("Start!!")
    print(a / b)
except ZeroDivisionError:
    print("0除算エラーです")
except TypeError:
    print("データ型エラーです")

先ほどのexceptの部分に追記します。
0除算エラーの場合はexceptの後にZeroDivisionErrorと書き、その後に:(コロン)を書きます。
インデントを下げて、「0除算エラーです」と表示します。
データ型エラーの場合はexceptの後にTypeErrorと書き、その後に:(コロン)を書きます。
インデントを下げて、「データ型エラーです」と表示します。
結果を確認してみましょう。
実行します。
今度はエラーの種類を識別し、「データ型エラーです」と表示されました。

エラー内容出力

最後に、エラー内容をそのまま受け取る方法を説明します。
except、エラーの種類、その後にas、名前、:(コロン)と書くと、指定した名前でエラー内容を受け取れます。
具体例で確認してみましょう。

a = 2
b = 0

try:
    print("Start!!")
    print(a / b)
except Exception as e:
    print(e)
finally:
    print("Finish!!")

変数aに2を代入し、変数bに0を代入します。
まずtryと書き、「Start!!」、そしてaをbで割った結果を表示します。
次にexceptと書き、Exception、as、eと書きます。
エラーの種類にExceptionを書くと、システムを終了させるエラー以外の全てのエラーが当てはまります。
そして、eを表示します。
最後にfinallyと書き、「Finish!!」と表示させます。
結果を表示してみましょう。
実行します。
結果が表示されました。
このように書くことでエラー内容を受け取って表示し、次のプログラムに移ることができます。