蔵風人

If you try it, it will be somehow & Simple is Best!


[ 最終更新日: 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 構文です。

どんなエラーを予測すべきか?

詳細は後に投稿しようと思う。

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
# 終了しました。