Pythonでraise文を使って意図的に例外を発生させる方法

この記事では、Pythonでプログラムの実行中に特定の条件が満たされなかった場合に、意図的にエラーを発生させるためのraise文について解説します。これにより、関数の不正な使用を防ぎ、より堅牢なコードを作成できます。


目次

raise文による例外の発生

raise文を使うと、プログラマは任意のタイミングで例外オブジェクトを生成し、プログラムの通常の実行フローを中断させることができます。

基本的な構文はraise ExceptionType("エラーメッセージ")です。引数の値が不適切な場合には、ValueErrorのような、より具体的で意味のある例外タイプを使用することが推奨されます。

# raise ValueError("無効な値が入力されました。")

関数内での入力値の検証

raise文は、関数に渡された引数が期待される条件を満たしているか検証する際に特に役立ちます。

以下のdraw_box関数は、指定された記号で箱を描画しますが、引数が不正な場合にはValueErrorを発生させます。

def draw_box(symbol, width, height):
    # 引数の検証
    if len(symbol) != 1:
        raise ValueError("`symbol`は1文字の文字列でなければなりません。")
    if width <= 2:
        raise ValueError("`width`は2より大きくなければなりません。")
    if height <= 2:
        raise ValueError("`height`は2より大きくなければなりません。")
        
    # 箱の描画
    print(symbol * width)
    for i in range(height - 2):
        print(symbol + (' ' * (width - 2)) + symbol)
    print(symbol * width)

この検証により、draw_box関数は不正な引数で呼び出された場合に、処理を続行する代わりに明確なエラーを報告します。


try...exceptブロックによる例外の捕捉

raise文によって発生した例外は、try...exceptブロックで捕捉(キャッチ)しない限り、プログラムを停止させます。例外を捕捉することで、エラーメッセージをユーザーに分かりやすく表示し、プログラムの実行を継続させることが可能です。

# 様々な引数で関数をテスト
test_cases = [('*', 5, 5), ('@', 15, 4), ('x', 2, 3), ('##', 5, 5)]

for sym, w, h in test_cases:
    try:
        print(f"\n--- draw_box('{sym}', {w}, {h}) の呼び出し ---")
        draw_box(sym, w, h)
    except ValueError as err:
        # draw_box関数内で発生したValueErrorを捕捉
        print(f"例外が発生しました: {err}")

実行結果:

--- draw_box('*', 5, 5) の呼び出し ---
*****
* *
* *
* *
*****

--- draw_box('@', 15, 4) の呼び出し ---
@@@@@@@@@@@@@@@
@             @
@             @
@@@@@@@@@@@@@@@

--- draw_box('x', 2, 3) の呼び出し ---
例外が発生しました: `width`は2より大きくなければなりません。

--- draw_box('##', 5, 5) の呼び出し ---
例外が発生しました: `symbol`は1文字の文字列でなければなりません。

無効な引数(width=2symbol='##')で関数が呼び出された場合でも、try...exceptブロックによってプログラムがクラッシュすることなく、エラーメッセージが適切に表示されていることがわかります。

まとめ

raise文は、プログラムが予期しない状態に陥ったことを明確に知らせるための重要な仕組みです。関数への入力値を検証し、不正な値に対してValueErrorのような具体的な例外を発生させることで、コードの信頼性とデバッグの容易さを向上させることができます。発生した例外はtry...exceptで捕捉し、適切に処理するのが一般的です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次