[ 最終更新日: 2026-06-23 04:36 閲覧回数: 19回 ]
構文エラーと例外
早速具体例を見てみます
構文エラー
for i in range(1,10):
print(i)
# 結果は、 File "<python-input-38>", line 2
# print(i)
# ^^^^^
# IndentationError: expected an indented block after 'for' statement on line 1
構文エラーは python 自体が動かないのです。
正しくは
for i in range(1,10):
print(i)
例外
次は例外
x = input('好きな数字を入力してください : ')
print ( int(x) * 3)
# 結果は
# 好きな数字を入力してください : 5
# 15
ご覧のように正常に機能しますが、もし全角で入力するとどうなるでしょうか?
# 好きな数字を入力してください : 太郎
# Traceback (most recent call last):
# File "<python-input-1>", line 2, in <module>
# print ( int(x) * 3)
# ~~~^^^
# ValueError: invalid literal for int() with base 10: '太郎'
このようにコードがどんなに正しくとも未然に防ぐことができないエラーを、例外という。
例外処理〜try except 構文
例外処理とは、例外の予測によって、実行を継続するようにする機能
try:
x = input('好きな数字を入力してください : ')
print ( int(x) * 3)
# ここから例外への対応を作成します。
except ValueError as ex:
print('エラー発生', ex)
# 結果は
# 好きな数字を入力してください : 太郎
# エラー発生 invalid literal for int() with base 10: '太郎'
異常時には、例外の except 節が呼び出され、それを実行して(この例ではエラーの詳細表示)終了するという処理を、try except 構文です。
どんなエラーを予測すべきか?
- SyntaxError
- NameError \ AttributeError
- importError
- indexError \ KeyError
- TypeError
詳細は後に投稿しようと思う。
except 構文
try:
処理
except 例外の処理 as 例外変数(ex): # 例外変数は何でも構わないが、通常は ex とするらしい。
例外発生時の処理
else:
例外が発生しなかった場合の処理
finally:
例外の有無にかかわらず実施する処理
上記の例では、
while True:
try:
x = input('好きな数字を入力してください : ')
print ( int(x) * 3)
# ここから例外への対応を作成します。
except ValueError:
print('入力値が間違いです')
else:
break
# 結果
# 好きな数字を入力してください : 太郎
# 入力値が間違いです
# 好きな数字を入力してください : Q
# 入力値が間違いです
# 好きな数字を入力してください : Q
# 入力値が間違いです
# 好きな数字を入力してください : 1
# 3
# 入力値が正しくなるまで入力を繰り返し、正しい入力があると break で終了
例外を発生させない処理
例えば、次のコードで考えてみた。不適正な入力値は常に「警告を表示する else ブロックに集めて再入力させるやり方」だ。これを例外処理と呼ぶべきかはわからないか、エラーを回避する一手段であると思われる
import random
import datetime
while True:
today = datetime.date.strftime(datetime.datetime.today(), '%Y-%m-%d %R')
fortune = ['大吉','吉','大凶']
x = input("1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) ")
if x == 'q':
print('終了しました。')
break
elif x == '1':
print(today)
elif x == '2':
print(random.sample(fortune,1))
else: # 不正な入力はこのelseブロックが実行されるので、警告を表示し、入力欄に戻る
print('入力値が不正です。再入力してください')
# 結果
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) 太郎
# 入力値が不正です。再入力してください
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) Q
# 入力値が不正です。再入力してください
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) Q
# 入力値が不正です。再入力してください
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) 1
# 2026-06-22 22:53
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) 2
# ['大凶']
# 1:日付時刻の表示 2:今日の運勢 q:終了 (半角英数字で入力) q
# 終了しました。