6.1 意図的な例外の発生
Pythonでは、raiseステートメントを使って意図的に例外を発生させることができるよ。これにより、プログラム内でエラーや不正な状況が発生したことを知らせることができるんだ。raiseの使い方や例外の再ラッピングについて見ていこう。
標準的な例外の発生
この操作の一般的な構文は次の通り:
raise 例外
ExceptionやTypeErrorなど、標準的な例外を適切なメッセージを渡して発生させることができるよ。
例: raise Exception
def check_number(value):
if value < 0:
raise Exception("申し訳ありませんが、0以下の数字は許可されていません")
try:
check_number(-5)
except Exception as e:
print(f"例外がキャッチされました: {e}")
この例では、値がマイナスの時にExceptionが"申し訳ありませんが、0以下の数字は許可されていません"というメッセージで発生するんだ。
例: raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("整数のみ許可されています")
try:
check_integer("string")
except TypeError as e:
print(f"例外がキャッチされました: {e}")
この例では、値が整数でない場合、TypeErrorが"整数のみ許可されています"というメッセージで発生するよ。
6.2 例外の再ラッピング
時には、ある例外をキャッチして、より具体的または有用な情報を提供するために別の例外を発生させたい場合があるよ。これは、raise ... fromステートメントを使って元の例外を新しい例外の原因として保存することで行えるんだ。
この操作の一般的な構文は次の通り:
raise 新しい例外 from 元の例外
例: 例外の再ラッピング
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("変数が空です")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("空の変数が検出されました") from e
この例では、変数の値が空の場合、最初にValueErrorが"変数が空です"というメッセージで発生する。その例外がキャッチされ、新しい例外EmptyVariableErrorが"空の変数が検出されました"というメッセージで発生し、元の例外はfromを使って伝達されるんだ。
6.3 再ラップされた例外の分析
raise ... fromステートメントを使うと、例外チェーンの情報を保存できて、デバッグに役立つことがあるんだ。再ラップされた例外とその原因を分析できるよ。
再ラップされた例外の分析例:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("変数が空です")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("空の変数が検出されました") from e
上記のコードを実行すると次のような出力になります:
Traceback (most recent call last): File "example.py", line 8, in
check_non_empty("") File "example.py", line 5, in check_non_empty raise ValueError("変数が空です") ValueError: 変数が空です
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "example.py", line 10, in
raise EmptyVariableError("空の変数が検出されました") from e EmptyVariableError: 空の変数が検出されました
最初のエラー(緑で示されています) はコードの深いところで発生した元のエラーです。時にはこのようなエラーが時折発生することがありますが、これはプログラムの通常の動作です。
二番目のエラー(青で示されています) は、より高レベルのエラーです。プログラムやフレームワークはその処理方法を知っているはずです。しかし、もっと深く掘り下げてエラーの原因を知りたい場合は、緑色のエラーが役立つでしょう。
全てがとても賢く設計されています。
GO TO FULL VERSION