Python | 例外処理 (try~except, else, finally, raise, 例外の自作)

2021年5月24日

公開日:2021/5/23

Pythonのプログラミング処理において,特定の箇所でエラーが出力されるとプログラミング処理が止まる.以下に「例外処理におけるエラーの種類」と「例外処理の作成」について説明する.

◆実施環境

Python 3.8.8

  1. 例外処理におけるエラーの種類

例外処理をする際にエラーを特定する必要があるので以下に記述する.

・FileNotFoundError: ファイルが見つからない
・NameError: 名前が見つからない
・IndexError: 配列などで指定したインデックスに値が存在しない
・TypeError: 型に関するエラー
・ZeroDivisionError: “0"で割ると出力される
・Exception: すべてのエラー

  1. 例外処理の作成

■例外処理 (“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'>

以上

Python例外処理

Posted by クマガイ