おぼえがき

過ちては則ち改むるにうんぬんかんぬん

例外処理(エラーハンドリング)とtry-except文について(Python)

f:id:feci:20210726231508j:plain

Python3

 

Python3.8.5での例外処理(エラーハンドリング)とtry-except文について。

#①例外処理なし
list = [012]

print(list[4])  #IndexError(listに4番目の値は存在しない)
print('エラーより下の行のスクリプトは実行されません'#このスクリプトは実行されない


#②例外処理あり
list = [012]

try:
  list[4]
except:
  print('例外処理を実行しました。'#例外処理を実行しました。

print('例外処理後のスクリプトは実行されます'#通常どおり問題なく実行される


#③try-except文のほかの条件も指定
list = [012]

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に記述した処理は、スクリプトに何があろうとも実行されます。

 

 

以上です。