Python3.8.5での例外処理(エラーハンドリング)とtry-except文について。
list = [0, 1, 2]
print(list[4]) #IndexError(listに4番目の値は存在しない)
print('エラーより下の行のスクリプトは実行されません') #このスクリプトは実行されない
#②例外処理あり
list = [0, 1, 2]
try:
list[4]
except:
print('例外処理を実行しました。') #例外処理を実行しました。
print('例外処理後のスクリプトは実行されます') #通常どおり問題なく実行される
#③try-except文のほかの条件も指定
list = [0, 1, 2]
try:
list[4]
except IndexError as aaa: #エラーの種類を指定・エラーメッセージを変数aaaに代入
print('例外処理を実行しました。') #IndexErrorなのでこっちが実行される。
print(aaa) #本来のエラーメッセージが表示(list index out of range)
except Exception:
print('上記以外のほとんどの種類のErrorに対応') #このスクリプトでは出番なし
finally:
print('finallyは必ず実行される') #finallyはErrorの種類と有無に関係なく必ず実行
print(aaa) #try文の外なのでスコープの関係でNameErrorがでる
例外処理はエラーハンドリングとも呼ばれます。
通常のなんらかのErrorが発生すると、Pythonはスクリプトを停止してエラーメッセージを吐く前に、まず例外をというオブジェクト(?)を投げてきます。
この例外をキャッチできなければ、通常どおりPythonはエラーメッセージを吐いてスクリプトを停止します。
しかしこの例外をキャッチしてやることで、プログラマーが事前に指定した方法でスクリプトにそのErrorを処理させることができます。
このような処理を例外処理またはエラーハンドリングと呼びます。
この例外処理をおこなうための手段がtry-except文です。
tryで指定したオブジェクト(?)からの例外をキャッチして、そのあとに記述したexceptの条件を満たした処理が実行されます。
ちなみにErrorを例外処理をした場合は、Errorよりも下の行のスクリプトは停止せずに通常どおりソースコードの最後まで実行されます。
try-except文の定形は以下のとおりです。
try:
キャッチする例外の指定
except Errorの種類 as 変数名:
条件を満たした際に実行する処理
else:
すべてのexceptの条件を満たさなかった際に実行する処理
finally:
エラーの種類と有無にかかわらず必ず実行する処理
exceptの「Errorの種類」と「変数名」の指定は必須ではありません。
Errorの種類を指定すると、その種類のErrorからの例外だった場合にのみ下の行に記述した処理を実行します。
exceptに指定(宣言)した変数には、本来でるはずだったErrorメッセージがそのまま代入されます。
またexceptはif文のelifのように、同じtry-except文の中で何個でも使えます。
ただし、当たり前ですがelseおよびfinallyの下の行にexceptを追加で記述することはできません。
elseは、if文やfor文でのelseとほぼ同じ機能を果たします。
同じtry-except文内のすべてのexceptの条件に当てはまらなかった場合にのみ、elseの処理が実行されます。
finallyはtry-except文の最後の行に記述する文です(必須ではありません)。
finallyに記述した処理はexceptやelseと違い、例外があろうとなかろうと、またErrorの種類に関係なく強制的に実行されます。
ちなみにもし上の行でErrorがでて例外処理できなかった場合、当然そのスクリプトはエラーメッセージを吐いて停止するはずです。
しかしfinallyはそのスクリプトの停止やエラーメッセージの表示にすら優先されます。
finallyに記述した処理は、スクリプトに何があろうとも実行されます。
以上です。