Python | 例外処理 (try~except, else, finally, raise, 例外の自作)
公開日:2021/5/23
Pythonのプログラミング処理において,特定の箇所でエラーが出力されるとプログラミング処理が止まる.以下に「例外処理におけるエラーの種類」と「例外処理の作成」について説明する.
◆実施環境
Python 3.8.8
- 例外処理におけるエラーの種類
例外処理をする際にエラーを特定する必要があるので以下に記述する.
・FileNotFoundError: ファイルが見つからない
・NameError: 名前が見つからない
・IndexError: 配列などで指定したインデックスに値が存在しない
・TypeError: 型に関するエラー
・ZeroDivisionError: “0"で割ると出力される
・Exception: すべてのエラー
- 例外処理の作成
■例外処理 (“try~except")
Pythonにおいて,特定の箇所でエラーが出力されるとプログラミング処理が止まる."try"の次行の論理式でエラーが出力され,"except"の後ろのエラーを同じ場合,エラーをキャッチし,"pass"によって次の処理に進む.以下に,いくつかの異なるエラーを用いた処理,および異なる出力を用いて,基本的な例外処理を記述する.
# 1の処理(エラーである"ZeroDivisionError"が出力される)
i = 3 / 0
print('処理完了')
# 2の処理("except"でエラーをキャッチし,"pass"を経てprintが実行)
try:
i = 3 / 0
except ZeroDivisionError:
pass
print('処理完了')
# 3の処理(変数"e"にエラー内容が入り,エラー内容とエラーの型をprintで出力)
try:
i = 3 / 0
except ZeroDivisionError as e:
print(e, type(e))
# 4の処理(エラーの場所とエラーの内容,型が出力される)
try:
i = 3 / 0
except ZeroDivisionError as e:
import traceback
traceback.print_exc()
# 5の処理("IndexError"を用いたエラーの型とエラー内容を出力)
try:
list1 = [1, 3, 6]
print(list1[3])
except IndexError as e:
print(e, type(e))
# 6の処理(すべてのエラーに対応する"Exception"を用いたエラーの型とエラー内容を出力)
try:
print(hello)
except Exception as e:
print(e, type(e))
■実行結果
# 1の結果
ZeroDivisionError: division by zero
# 2の結果
処理完了
# 3の結果
division by zero <class 'ZeroDivisionError'>
# 4の結果
line 25, in <module>
i = 3 / 0
ZeroDivisionError: division by zero
# 5の結果
list index out of range <class 'IndexError'>
# 6の結果
name 'hello' is not defined <class 'NameError'>
■例外処理 (“try~except": “else"と"finally"を利用)
以下にエラーが発生有無によって処理が変わる構文を記述する.なお,elseとfinallyの意味は以下になる.
・else: “try"の次行の論理式にエラーが起きると,処理がされない.
・finally: “try"の次行の論理式のエラー有無に関わらず,処理がされる.
# 1の処理(try後にエラーが起きるので,elseの処理がされない)
try:
i = 3 / 0
except Exception as e:
print(e, type(e))
else:
print('else処理')
# 2の処理(try後にエラーは起きないので,elseの処理がされる)
try:
i = 3 / 1
except Exception as e:
print(e, type(e))
else:
print('else処理')
# 3の処理(try後にエラーが起きるので,elseの処理はされず,finallyの処理はされる)
try:
print(hello)
except NameError:
pass
else:
print('else処理')
finally:
print('finally処理')
■実行結果
# 1の結果
division by zero <class 'ZeroDivisionError'>
# 2の結果
else処理
# 3の結果
finally処理
■例外処理 (“try~except": “raise"を利用)
意図的にエラーを発生させる際に"raise"を用いる.”raise エラーの型(エラー内容)”を利用する.
# 1の処理(raiseによって意図的にエラーを発生させる)
try:
raise NameError('名前のエラーです')
except NameError as e:
print(e,type(e))
■実行結果
# 1の結果
名前のエラーです <class 'NameError'>
■例外処理 (“try~except": 例外を自作)
例外を作成するには,例外の名称を書き,"class"と"(Exception):"で挟み,次行にインデントを入れて,"pass"を書く.
# 1の処理(例外の自作は"MyError")
class MyError(Exception):
pass
try:
raise MyError('マイエラーです')
except MyError as e:
print(e,type(e))
■実行結果
# 1の結果
マイエラーです <class '__main__.MyError'>
以上