🐍
Python100本ノック#12 例外(Exception)処理
例外(Exception)とは
Pythonではプログラムの実行時に発生するエラーを「例外」と呼ぶ。例外に対処することを「例外処理」といい、Pythonではtry
, except
文に例外を発生させる可能性があるコードと、例外が発生した際に行う処理を記述していく。
例外処理
基本文法(try, except)
try:
発生しうる例外
except:
例外をキャッチした際に処理
具体例
try:
f = open('python.txt', 'r')
content = f.readline()
print(content, end='')
except:
f = open('python.txt', 'w', encoding='utf-8')
f.write('例外発生')
f.close()
実行結果
python.txtファイルが作成された。
特定例外処理
特例の例外だけを対処するための例外処理を行う。
try:
f = open('python.txt', 'r')
except 例外クラス as e:
print(e)
同時に複数の特定例外処理
try:
発生しうる例外
except (例外クラス1, 例外クラス2) as e :
例外をキャッチした際に処理
具体例
try:
print(name)
# print(10/0)
except (NameError, ZeroDivisionError) as e:
print(e)
未知の例外処理
Exceptionはすべての例外の基底(親)クラスになる。
try:
発生しうる例外
except Exception as e:
print(e)
具体例
try:
print(name)
except Exception as e:
print(e)
例外処理のelse,finally
-
else
例外がない分岐に利用する。
try:
print(1)
except Exception as e:
print(e)
else:
print('None Exception.')
-
finally
例外有無にかかわらず、実行したい処理があるときに利用する。
ファイルを閉じる、DBコネクションを切断する例を挙げられる。
try:
f = open('python.txt', 'r')
except:
f = open('python.txt', 'w')
else:
print('None Exception.')
finally:
print('Close file.')
f.close()
raiseによるカスタム例外
Pythonにおいて、カスタム例外を発生させるための構文は raise 例外クラスオブジェクトである。
具体例
パスワードの長さが不足している場合、例外を発生させます(ユーザーがパスワードを入力し、入力された長さが6桁未満の場合、エラーが発生し、つまりカスタム例外が発生し、その例外をキャッチする)。
実装
def input_password():
password = input('6桁以上のパスワードを入力してください。:')
if len(password) < 6:
# 例外を発生させる
raise Exception('パスワードの長さは6桁より少ない')
return
# 例外なければパスワード表示
print(password)
input_password()
output
6桁以上のパスワードを入力してください。:fdsa
Traceback (most recent call last):
File "C:\Python100knock\12_exception_2.py", line 11, in <module>
input_password()
File "C:\Python100knock\12_exception_2.py", line 5, in input_password
raise Exception('パスワードの長さは6桁より短い')
Exception: パスワードの長さは6桁より短い
OOPふうな実装
class ShortInputError(Exception):
# パスワードの長さと最小長さ
def __init__(self, length, min_length):
self.length = length
self.min_length = min_length
# メッセージ定義
def __str__(self):
return f'入力されたパスワードの長さは{self.length},{self.min_length}桁より少ないとダメです。'
try:
password = input('6桁以上のパスワードを入力してください:')
if len(password) < 6:
raise ShortInputError(len(password), 6)
except Exception as e:
print(e)
else:
print(f'入力済み、パスワードは:{password}')
output
1回目
6桁以上のパスワードを入力してください:fdsafdsafdsa
入力済み、パスワードは:fdsafdsafdsa
2回目
6桁以上のパスワードを入力してください:fdsa
入力されたパスワードの長さは4,6桁より少ないとダメです。
Discussion