Python | 1 日 120 分 × 7 日アプリ学習:エラーハンドリング付き入力アプリ(中級編)

Web APP Python
スポンサーリンク

1日目のゴール

1日目のテーマは
「try / except を使って、入力エラーでアプリが落ちないようにする」 ことです。

今日のゴールはシンプルです。

ユーザーに数字を入力してもらう
間違った入力(文字など)が来ても、プログラムが落ちない
「もう一度入力してください」と優しく言える

この3つができれば、1日目は大成功です。


そもそも「エラー」とは何か

Pythonが「これは無理です」と言う瞬間

まず、エラーの正体をちゃんとイメージしましょう。

例えば、こんなコードを書きます。

age_text = input("年齢を入力してください: ")
age = int(age_text)
print(f"あなたは {age} 歳ですね。")
Python

ここで「20」と入力すれば問題ありません。
でも「二十」や「abc」と入力すると、こうなります。

ValueError: invalid literal for int() with base 10: '二十'
Python

Pythonは int("二十") が理解できず、
「これは整数に変換できません」と怒ってプログラムを止めます。

これが「例外(エラー)」です。

ポイントは、

エラー自体は悪ではない
でも、何も対策しないとプログラムがそこで強制終了する

ということです。


try / except の基本形を知る

「ここでエラーが出るかも」を囲う

Pythonでエラーを「捕まえる」ための基本形はこうです。

try:
    危険かもしれない処理
except エラーの種類:
    エラーが起きたときにやる処理
Python

さっきの int(age_text) を守ってあげると、こうなります。

age_text = input("年齢を入力してください: ")

try:
    age = int(age_text)
    print(f"あなたは {age} 歳ですね。")
except ValueError:
    print("数字で入力してください。")
Python

これで、「二十」や「abc」と入力しても
プログラムは落ちずに、メッセージを出して続行できます。

ここで超重要なのは、

「エラーが起きそうな行だけを try の中に入れる」

という感覚です。
なんでもかんでも try の中に突っ込むのは、逆に読みにくくなります。


具体例:安全な割り算アプリ

まずは try / except なしの危険な版

次のような「割り算アプリ」を考えます。

a_text = input("割られる数を入力してください: ")
b_text = input("割る数を入力してください: ")

a = int(a_text)
b = int(b_text)

result = a / b
print(f"{a} ÷ {b} = {result}")
Python

ここには二つの危険があります。

数字以外を入れたときの ValueError
0で割ったときの ZeroDivisionError

どちらも、起きた瞬間にプログラムが落ちます。


try / except で最低限守る

まずは「落ちない」ことを最優先にします。

a_text = input("割られる数を入力してください: ")
b_text = input("割る数を入力してください: ")

try:
    a = int(a_text)
    b = int(b_text)
    result = a / b
    print(f"{a} ÷ {b} = {result}")
except ValueError:
    print("数字で入力してください。")
except ZeroDivisionError:
    print("0 で割ることはできません。")
Python

ここでのポイントは二つです。

ValueError と ZeroDivisionError を分けて書いている
どのエラーが起きたかによって、メッセージを変えている

これだけで、ユーザーにとってかなり親切なアプリになります。


「もう一度入力させる」までやってみる

エラーを「なかったこと」にせず、やり直しさせる

本当に使えるアプリにするには、
エラーが起きたときに「やり直し」させたいですよね。

while ループと組み合わせると、こう書けます。

while True:
    a_text = input("割られる数を入力してください: ")
    b_text = input("割る数を入力してください: ")

    try:
        a = int(a_text)
        b = int(b_text)
        result = a / b
    except ValueError:
        print("数字で入力してください。もう一度やり直します。\n")
        continue
    except ZeroDivisionError:
        print("0 で割ることはできません。もう一度やり直します。\n")
        continue

    print(f"{a} ÷ {b} = {result}")
    break
Python

ここで深掘りしたいのは、continuebreak の使い方です。

エラーが起きたときは continue でループの先頭に戻る
成功したときだけ break でループを抜ける

これにより、

エラー → メッセージ → 再入力
成功 → 結果表示 → 終了

という自然な流れが作れます。


except を「雑に」使わないことの大事さ

except: だけで全部捕まえるのは危険

Pythonでは、こう書くこともできます。

try:
    危険な処理
except:
    print("何かエラーが起きました。")
Python

これは「どんなエラーでも全部ここで捕まえる」という意味です。
一見便利そうですが、初心者ほどこれは避けた方がいいです。

理由はシンプルで、

本来気づくべきバグまで飲み込んでしまう
どこで何が起きているのか分からなくなる

からです。

1日目の結論としては、

まずは具体的なエラー名(ValueError, ZeroDivisionError など)を書く
どうしても全部捕まえたいときだけ、最後に except Exception: を使う

というスタイルを覚えておくと安全です。


1日目のミニアプリ:年齢入力+エラーハンドリング

「落ちない入力アプリ」を完成させる

今日の学びを使って、
シンプルだけど“ちゃんとしている”入力アプリを書いてみます。

仕様はこうです。

年齢を整数で入力してもらう
数字以外なら「数字で」と言ってやり直し
0以下なら「正の数で」と言ってやり直し
正しく入力されたら「○歳ですね」と表示して終了

コードはこうなります。

def input_age():
    while True:
        age_text = input("年齢を入力してください: ")

        try:
            age = int(age_text)
        except ValueError:
            print("数字で入力してください。\n")
            continue

        if age <= 0:
            print("0より大きい数を入力してください。\n")
            continue

        return age

def main():
    age = input_age()
    print(f"あなたは {age} 歳ですね。")

main()
Python

ここでの重要ポイントは三つです。

try / except は「型変換が失敗するかもしれない場所」にだけかけている
「値としておかしい」(0以下など)は if でチェックしている
入力ロジックを input_age という関数に分けている

この分け方を覚えると、
「エラー処理がごちゃごちゃして読めないコード」から
一気に卒業できます。


1日目で絶対に押さえてほしい本質

try / except は「エラーを隠す道具」ではない

今日いちばん伝えたいのは、

try / except は
エラーをなかったことにするためではなく、
エラーが起きたときに「どう振る舞うか」を決めるための仕組み

だということです。

どこでエラーが起きうるかを想像する
そのときユーザーに何を伝えるかを決める
必要なら、やり直しの流れを作る

この3つを意識して書けるようになれば、
あなたのコードはもう「初心者の壁」を一枚超えています。

2日目以降は、

複数の入力項目
関数化された入力処理
JSON保存アプリとの組み合わせ

などに try / except を広げていきます。
「どこに try を置くか」を意識しながら、
今日のミニアプリを自分なりに改造してみてください。

タイトルとURLをコピーしました