この記事では、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=2
やsymbol='##'
)で関数が呼び出された場合でも、try...except
ブロックによってプログラムがクラッシュすることなく、エラーメッセージが適切に表示されていることがわかります。
まとめ
raise
文は、プログラムが予期しない状態に陥ったことを明確に知らせるための重要な仕組みです。関数への入力値を検証し、不正な値に対してValueError
のような具体的な例外を発生させることで、コードの信頼性とデバッグの容易さを向上させることができます。発生した例外はtry...except
で捕捉し、適切に処理するのが一般的です。