プログラム実行中に考慮しなくてはいけないことの1つに、エラーや例外の処理があります。
大抵のプログラム言語には、これを行うための専用の構文が存在しています。例えば、Javaの言語でいう「try-catch文」です。
今回は、そんな例外処理をpythonで行う方法の基本形について、まとめます。
例外処理
Python での例外処理は、他の言語と同様に「try」を使用します。異なる点としては、例外処理を行う際の記載する際に使用する構文が異なってきます。
基本形
try文を扱う際は、except文とセットで用います。
それぞれ、どんな処理を記載するかは以下のようになっています。
句 | 処理の内容 |
try | 例外を検出を確認する処理です。 |
except | try文内で例外が発生した場合に行う処理です。
例外が発生しなければ、処理が実行されずにスキップされます。 |
処理のフローを記載すると、以下のようになります。
なお、サンプル内での「no_code()」は、未定義の関数だと思ってください。そのため、「NameError」の例外(Exceotion)が得られます。
実際のソースコードで一例を示します。
コードサンプル:
try:
no_code()
except:
print(“Exception occurred.”)
実行結果:
Exception occurred.
例外の種類毎に処理を分けたい場合
特定の例外に対して、個別に処理を分けることも可能です。その場合は、except の後ろに例外の種類を記載します。
処理のフローを記載すると、以下のようになります。
実際のソースコードで一例を示します。
コードサンプル:
try:
no_code()
except NameError:
print(“Name Error occurred.”)
実行結果:
Name Error occurred.
また、except は、複数連ねることができます。そのため、2個以上の特定の例外に対する処理を分けることが可能になります。
以下のように、タプルを用いることで、1つの except で複数の例外を指定することもできます。
コードサンプル:
try:
doc_open()
doc_edit()
doc_save()
except (FileExistsError, FileNotFoundError):
print(“File Error occurred.”)
※doc_open()、doc_edit()、doc_save()は、文書の「開く」「編集」「保存」を行う関数だと思ってください。
なお、ここで注意しなければならない点があります。それは、指定していない例外が発生した場合です。
処理する例外を指定した場合、指定していない例外が発生した場合は、プログラムの実行が異常終了してしまいます。
この場合は、システム終了を除く全ての組み込み例外の親となるExceptionを用いるのが良いでしょう。
コードサンプル:
try:
no_code()
except NameError:
print(“Name Error occurred.”)
except Exception:
print(“Undefined Eception occurred.”)
もしくは、何も指定していない except: を追加しても良いでしょう。
コードサンプル:
try:
no_code()
except NameError:
print(“Name Error occurred.”)
except:
print(“Undefined Eception occurred.”)
このように、例外を指定した場合は、全ての例外を処理するための処理を施す必要があります。
なお、python の特性でもありますが、ソースコードは上から順に処理されます。
そのため、より保証範囲が大きいExceptionを指定しているexcept文ほど、下に設定するのが良いでしょう。
もし、一番上のexceptにExceptionが指定されている場合、以降にどんなExceptionの子となる例外が指定されていても、処理されることはありません。
例外の情報を出力した場合
例外の情報を直接出力したいような場合は、実体(オブジェクト)として取得して処理します。
具体的には、except文を「except 例外名 as 変数名:」の並びに則って記載します。
コードサンプル:
try:
no_code()
except Exception as e:
print(e)
実施結果:
name ‘no_code’ is not defined
オブジェクトとして取得した例外(上記で言う「e」)には、例外の内容が含まれています。
また、例外名だけを取得したい場合は、「e.__class__.__name__」を用いて、以下のように記載します。
コードサンプル:
try:
no_code()
except Exception as e:
print(e.__class__.__name__)
実施結果:
NameError
もし、例外の全ての情報を取得したい場合は、「traceback.format_exc()」を使用します。
なお、tracebackを使用するには、「import traceback」を記載する必要があります。
コードサンプル:
import traceback
try:
no_code()
except Exception as e:
print(traceback.format_exc())
実施結果:
Traceback (most recent call last):
File “実行したファイルの絶対パス”, line “エラーの発生した行”, in <module>
no_code()
NameError: name ‘no_code’ is not defined
まとめ
今回は、pythonにおける例外処理の前編として基本形でもあるtry-exceptで説明できる内容を記載しました。
中編では、try-exceptから派生した構文をメインにまとめます。
こちらも、参考にしてみて下さい。