見出し画像

毎日Python:基礎から学んで実務まで|Day19

例外の超入門:try / exceptで“落ちない”プログラムにする

Day18では短絡評価で「危ない処理を条件式で守る」方法を学びました。
でも実務では、条件式だけでは守りきれない場面が必ず出ます。

  • 文字列を数値に変換したら失敗した

  • ファイルが存在しなかった

  • ネットワークが一時的に落ちた

  • 辞書にキーがなくて落ちた

こういう「失敗しうる処理」を安全に扱うための仕組みが
例外(exception)try〜except



1. 例外(exception)とは?

例外は一言でいうと、

プログラムが続行できない問題が起きたとき、Pythonが投げる「エラーの合図」

です。

Day7で見た Traceback の最後に出ていた
ValueError や TypeError などが「例外の種類」です。

例:

  • int("abc") → ValueError(変換できない)

  • "10" + 3 → TypeError(型が合わない)

  • d["missing"] → KeyError(キーがない)


2. try/except

失敗しうる処理を“囲う”

基本形はこれです。

try:
    # 失敗するかもしれない処理
    ...
except 例外の種類:
    # 失敗したときの処理
    ...

3. まず体験!

int変換でValueErrorを捕まえる

入力は文字列なので、変換は失敗しがちです。

s = input("Age: ").strip()

try:
    age = int(s)
except ValueError:
    print("Please enter a number.")
    raise SystemExit

print("age:", age)
  • 正しい入力(例:20)→ 普通に進む

  • 変な入力(例:abc)→ exceptに入ってメッセージを出して終了

これで「落ちる」ではなく「説明して終わる」になります。


4. 複数の例外を扱う

たとえば「数値でない」以外にも、意図しない型が来たら?というケースもありますが、初心者のうちはまず 狙った例外だけ を捕まえるのが大事です。

try:
    x = float(input("x: "))
except ValueError:
    print("Not a number")
    raise SystemExit

5. 絶対に避けたい

except: で全部握りつぶす

初心者がやりがちな危険パターンです。

try:
    ...
except:
    print("error")

これだと、予想外のバグまで全部「error」になってしまい、原因追跡が難しくなります。


6. else / finally

以下は「そんなのあるんだ〜」くらいに見てくれればいいです!

else:例外が起きなかったときだけ実行

try:
    age = int(input("Age: "))
except ValueError:
    print("Not a number")
else:
    print("OK:", age)

finally:成功でも失敗でも必ず実行

ファイルを閉じる、後片付けなどで使います(ファイル回で本格的に)。

try:
    ...
except ValueError:
    ...
finally:
    print("done")

※まずは「try/exceptが書ければOK」です。


7. 実務の感覚

例外は“通常の分岐”にしない

ここが大事です。

  • if文:正常なケースの分岐(仕様通りの判断)

  • try/except:失敗しうる処理の保険(異常系・外部要因)

例外は「起きてもおかしくないが、起きたら対処が必要」なものを扱う、という感覚です。


今日の演習

day19/main.py を作って、堅牢な入力ツールを作ります。
Day16の集計ツールを、try/exceptで“ちゃんと落ちにくく”します。

仕様

  • 数値を何回でも入力して集計(小数OK)

  • q / quit で終了

  • 空入力は無視

  • 数値変換に失敗したら警告して続行(try/except)

  • 最後に件数・合計・平均を表示

チェックポイント

  • abc を入れても落ちずに続く

  • q で抜ける

  • 空入力はスルー

  • 数値が入った分だけ合計に反映される


次回予告(Day20)

次回は よくあるバグ:無限ループと対処
whileとbreak/continueを使うと避けて通れない「終わらない問題」を、原因別に攻略します。

模範例

count = 0
total = 0.0

while True:
    s = input("number (or q to quit): ").strip()

    if s == "":
        continue

    s_lower = s.lower()
    if s_lower == "q" or s_lower == "quit":
        break

    try:
        x = float(s)
    except ValueError:
        print("Please enter a valid number.")
        continue

    count += 1
    total += x

print("----- result -----")
print(f"count: {count}")
print(f"total: {total}")

if count > 0:
    print(f"avg  : {total / count}")
else:
    print("avg  : (no data)")

いいなと思ったら応援しよう!

れん - Web Step | エンジニア技術配信 応援をぜひよろしくお願いします🔥 いただいたチップでより素晴らしい記事を発信していけるよう精進してまいります!