はじめに
pythonによるプログラムを組む時、予期せぬエラーが発生するときがある。
例えば、共有のエクセルファイルを読み込むとき、誰かがファイルを開いている状態であるとか、指定のファイル名が存在しないなど
しかし、エラー処理をしないままの状態だと、プログラムが最後まで実行されず、途中で終了してしまう。
今回はエラー処理についてまとめてみた。
環境
windows 10
import platform
print('python version: ' , platform.python_version())
# python version: 3.7.8
前回記事
Code
問題
f = open("nofile.xlsx", 'r')
print('second process')
Traceback (most recent call last):
File "error.py", line 19, in <module>
f = open("nofile.xlsx", 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'nofile.xlsx'
エラーが発生した場合、エラーが発生した以後のコードは実行されず、プログラムが終了してしまう。
→ エラーが発生した場所は飛ばして残りすべてのコードを実行する方がプログラムとして有益である。
エラーがある場合
try:
f = open("nofile.xlsx", 'r')
print('opened file')
except:
print('cannot open it')
finally:
print('process done')
cannot open it
process done
try
でコードの実行を試みる
except
エラーが生じた場合のコードを実行する。
finally
エラーの有無に関係なく、最終的にコードを実行する。
エラー以降のtry
のコードは実行されず、except
文が実行された。
エラーがない場合
try:
f = open("file_exist.xlsx", 'r')
print('opened file')
except:
print('cannot open it')
finally:
f.close()
print('process done')
opened file
process done
エラーがない場合、except
文は実行されない。
エラー条件の指定
try:
a = 9/0
print(a)
except ZeroDivisionError:
print('zero division error')
except FileNotFoundError:
print('no file')
finally:
print('process done')
zero division error
process done
該当するエラーが発生した時のみ、コードを実行する。
エラー文の出力
try:
f = open("nofile.xlsx", 'r')
except Exception as e:
print(e)
[Errno 2] No such file or directory: 'nofile.xlsx'
traceback によるエラー文の出力
import traceback
try:
a = 9/0
print(a)
except Exception:
traceback.print_exc()
Traceback (most recent call last):
File "error.py", line 24, in <module>
a = 9/0
ZeroDivisionError: division by zero
logging によるエラー文の出力
import logging
try:
a = 9/0
print(a)
except Exception:
logging.exception("it is error")
ERROR:root:it is error
Traceback (most recent call last):
File "error.py", line 13, in <module>
a = 9/0
ZeroDivisionError: division by zero
logging
やtraceback
によってエラーの発生した部分など、より追加的な情報を表示することができる。
まとめ
エラー処理を適切に行うことによって、プログラムの管理がより容易になる。
現在、私は自作の1000行ほどののプログラムを仕事の自動化プログラムとして利用しているが、少し条件が変わるとプログラムが強制終了するなど、トラブルが多い。
よってプログラムの管理も考えた設計をするためには、エラー処理の工夫が必要となる。
関連記事