コース一覧
    Pythonエラー・データ形式
    つくる 入力検証の例外設計

    Pythonエラー・データ形式

    例外処理とデータ形式を深め、異なる入力を検証し変換する処理を設計できるようにします。

    1
    エラー処理の設計
    01. 例外の階層15分
    02. raiseで例外を投げる15分
    03. カスタム例外15分
    04. finallyとelse15分
    05. assertで前提を守る15分
    06. つくる 入力検証の例外設計20分
    07. 第5章クイズ10分
    2
    ファイルとデータ形式
    01. csvモジュール15分
    02. JSONで保存15分
    03. JSONを読み込む15分
    04. pathlibでパス操作15分
    05. 文字コード15分
    06. つくる JSON保存へ移行20分
    07. 第6章クイズ10分

    つくる 入力検証の例外設計

    このレッスンでできるようになること。この章で覚えた道具だけを使い、家計簿の取り込み処理を「下の層で投げて、上の層で受け止める」形に組み上げられるようになります。新しい概念は足しません。

    エラー処理の設計で一番大事なのは、投げる場所と受け止める場所を分けることです。データを 1 件ずつ見る検証関数は、おかしいと思ったら例外を投げるだけにします。何件処理したか、どこで止めるかを決めるのは、まとめ役の関数の仕事です。この分け方をしておくと、検証の規則を足すときに、まとめ役へ手を入れずに済みます。

    今回組み上げるのは次の流れです。まず assert で、そもそも受け取った引数の形が正しいかを確かめます。次に 1 件ずつ検証関数へ渡し、InvalidExpenseError を受け止めて不備の一覧に貯めます。例外が出なかった件だけを else の節で受理します。最後に合計と予算を比べ、超えていれば BudgetOverError を投げて自分で受け止め、finally の節で処理の記録を残します。

    Python

    class InvalidExpenseError(Exception):
        pass

    このように、この章で書いた raise、カスタム例外、else、finally、assert がすべて 1 本の関数の中に並びます。どれも役割が違うので、置き場所を間違えないように読み返しながら書いてみてください。

    要件

    1. InvalidExpenseError と BudgetOverError を Exception を継承して定義する
    2. validate は品名が空なら 品名がありません、金額が整数でなければ 品名 の金額が数値ではありません、金額がマイナスなら 品名 の金額がマイナスです を投げる
    3. import_expenses は records がリストでないことを assert で捕らえ、accepted と log を空、errors に前提のメッセージ、total を 0、status を 中止しました にした辞書を返す
    4. 検証を通った品名を accepted に、投げられたメッセージを errors に貯め、金額を total に足す
    5. total が budget を超えたら BudgetOverError を投げて受け止め、status を 警告 メッセージ にする。超えなければ 予算内です 残り 残額 円 にする
    6. finally の節で log に 検証を終えました 受理 件数 件 を追加する
    7. 返す辞書のキーは accepted, errors, total, status, log とする

    ヒント

    assert isinstance(records, list), "records はリストで渡してください" から始めます

    1 件ごとの try は except InvalidExpenseError と else の組で書きます

    予算の判定は try / except / else / finally をひとまとまりで書きます

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/08/07

    関連レッスン

    • 第5章クイズ

      例外設計の理解を確認します。

    • csvモジュール

      手書きの split をやめて csv モジュールに載せ替えます。

    • assertで前提を守る

      assert で集計前のデータが壊れていないことを検査します。

    • finallyとelse

      finally と else で、後始末と正常時の処理を書き分けます。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • 処理計算や代入を表す長方形
    • 設計何をどう作るかを決める前工程
    • 関数処理に名前を付けて再利用できる単位
    • 引数位置引数=順番で渡す。
    • 継承親クラスの機能を子クラスへ引き継ぐ仕組み
    • リスト順序付きで複数の値を扱うデータ構造
    main.py
    エディタを読み込んでいます

    メモ

    つくる 入力検証の例外設計

    ⌘S で保存