ここで説明したように,例えば scores
リストから取り出して表示したい要素のインデックスをキーボードから入力し続け,「q」が入力されたら処理を終了するようなプログラムを考えます.このプログラムに対してユーザが期待通りの入力作業を行うとプログラムは正常に動作します.
scores = [10, 30, 25, 20]
while True:
x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
if x == 'q':
break
pos = int(x)
print(scores[pos])
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎ 10 0 から 3 までの整数を入力してください(qで終了します): 1 ⏎ 30 0 から 3 までの整数を入力してください(qで終了します): -2 ⏎ 25 0 から 3 までの整数を入力してください(qで終了します): 3 ⏎ 20 0 から 3 までの整数を入力してください(qで終了します): q ⏎ 終了しました
しかしながら,ユーザが 4 という入力を与えた場合には 7 行目の IndexError によりプログラムが停止,それ以降の処理は行われません.
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎ 10 0 から 3 までの整数を入力してください(qで終了します): 1 ⏎ 30 0 から 3 までの整数を入力してください(qで終了します): 2 ⏎ 25 0 から 3 までの整数を入力してください(qで終了します): 3 ⏎ 20 0 から 3 までの整数を入力してください(qで終了します): 4 ⏎ --------------------------------------------------------------------------- IndexError Traceback (most recent call last) Input In [17], in <cell line: 3>() 5 break 6 pos = int(x) ----> 7 print(scores[pos]) 8 print('終了しました') IndexError: list index out of range
また,ユーザが a という入力を与えた場合には 6 行目の ValueError によりプログラムが停止,それ以降の処理は行われません.
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎ 10 0 から 3 までの整数を入力してください(qで終了します): a ⏎ --------------------------------------------------------------------------- ValueError Traceback (most recent call last) Input In [14], in <cell line: 3>() 4 if x == 'q': 5 break ----> 6 pos = int(x) 7 print(scores[pos]) 8 print('終了しました') ValueError: invalid literal for int() with base 10: 'a'
Python ではエラー(例外)が起こる可能性がある場所を try
の中に記述し,except
によって例外を処理することでプログラムの強制終了を避け,例外の内容をユーザに通知することができるようになります.
次のコードでは,何らかの例外が発生したことだけをキャッチしてユーザに通知するとともに,強制終了せずに処理を継続します.具体的には,try
のブロックに含まれる 7 行目と 8 行目の処理が実行され,もしもそこで例外が発生すると except
のブロックが実行されることになります.
scores = [10, 30, 25, 20]
while True:
x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
if x == 'q':
break
try:
pos = int(x)
print(scores[pos])
except:
print('何らかの例外が発生しました')
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎ 10 0 から 3 までの整数を入力してください(qで終了します): 2 ⏎ 25 0 から 3 までの整数を入力してください(qで終了します): 4 ⏎ 何らかの例外が発生しました 0 から 3 までの整数を入力してください(qで終了します): a ⏎ 何らかの例外が発生しました 0 から 3 までの整数を入力してください(qで終了します): q ⏎ 終了しました
さらに,具体的な例外の種類についても取得して,その種類によって処理の内容を変えることもできます.例えば,次の例では IndexError
と ValueError
について特別な処理を記述し,それ以外の例外についてもエラーメッセージを表示させます.
scores = [10, 30, 25, 20]
while True:
x = input(f'0 から {len(scores)-1} までの整数を入力してください(qで終了します): ')
if x == 'q':
break
try:
pos = int(x)
print(scores[pos])
except ValueError as val_err:
print(f'整数ではありません : {val_err}')
except IndexError as idx_err:
print(f'入力された数値は0から{len(scores)-1}までの整数ではありません : {idx_err}')
except Exception as other_err:
print(f'何らかの例外が発生しました : {other_err}')
print('終了しました')
0 から 3 までの整数を入力してください(qで終了します): 0 ⏎ 10 0 から 3 までの整数を入力してください(qで終了します): 2.0 ⏎ 整数ではありません : invalid literal for int() with base 10: '2.0' 0 から 3 までの整数を入力してください(qで終了します): 2 ⏎ 25 0 から 3 までの整数を入力してください(qで終了します): a ⏎ 整数ではありません : invalid literal for int() with base 10: 'a' 0 から 3 までの整数を入力してください(qで終了します): 4 ⏎ 入力された数値は0から3までの整数ではありません : list index out of range 0 から 3 までの整数を入力してください(qで終了します): 3 ⏎ 20 0 から 3 までの整数を入力してください(qで終了します): q ⏎ 終了しました
なお,上のコードで print(f'...{変数名}...')
は f 文字列です.