🐍

Python100本ノック#12 例外(Exception)処理

2023/12/04に公開

例外(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