毎日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 SystemExit5. 絶対に避けたい
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)")
いいなと思ったら応援しよう!
応援をぜひよろしくお願いします🔥
いただいたチップでより素晴らしい記事を発信していけるよう精進してまいります!