3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[python] エラーの処理 -except-

Last updated at Posted at 2022-10-12

はじめに

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

loggingtraceback によってエラーの発生した部分など、より追加的な情報を表示することができる。

まとめ

エラー処理を適切に行うことによって、プログラムの管理がより容易になる。
現在、私は自作の1000行ほどののプログラムを仕事の自動化プログラムとして利用しているが、少し条件が変わるとプログラムが強制終了するなど、トラブルが多い。
よってプログラムの管理も考えた設計をするためには、エラー処理の工夫が必要となる。

関連記事

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?