4.1 複数例外のキャッチ
Pythonでは、複数のexceptブロックを使ったり、例外のタプルを使った1つのexceptブロックを使って、複数の例外を処理することができるよ。それぞれのアプローチをみてみよう。
複数のexceptブロック
複数のexceptブロックを使って、異なるタイプの例外をそれぞれ違う方法で処理できるんだ。
try:
# 例外が発生する可能性のあるコード
result = int("abc")
except ValueError:
print("エラー: 不正な値。")
except ZeroDivisionError:
print("エラー: ゼロで除算。")
例外のタプルを使った1つのexceptブロック
例外をタプルとして渡すことで、1つのexceptブロックで複数の例外を処理できるよ。
try:
# 例外が発生する可能性のあるコード
result = int("abc")
except (ValueError, ZeroDivisionError) as e:
print(f"エラーが発生しました: {e}")
except NameError as varの使い方
例外を処理するときにexcept <ExceptionType> as <variable>という構文を使って例外オブジェクトを取得できるんだ。これでエラーメッセージなどの例外情報にアクセスできるようになるんだよ。
try:
# NameErrorが発生するかもしれないコード
print(undeclared_variable)
except NameError as e:
print(f"エラーが発生しました: {e}")
print(f"エラーのタイプ: {type(e)}")
4.2 エラー変数のスコープ
例外が保存される変数(上の例のe)は、自分のexceptブロックの中だけで利用可能なんだ。そのブロックの外では変数は利用できないよ。
try:
# NameErrorが発生するかもしれないコード
print(undeclared_variable)
except NameError as e:
print(f"エラーが発生しました: {e}")
print(f"エラーのタイプ: {type(e)}")
# ここではeはもう利用できないので、次の行はNameErrorを引き起こす
# print(e) # NameError: name 'e' is not defined
例外の外で重要なことをしたい場合は、別の変数に保存しておく必要があるよ。例えば:
exception = None
try:
# 例外が発生するかもしれないコード
result = int("abc")
except ValueError as e:
exception = e
print("エラー: 不正な値。")
except ZeroDivisionError as e:
exception = e
print("エラー: ゼロで除算。")
print(exception)
exception変数が最後に発生した例外を保持していることに注目してね。これはtryブロックの外で後続の処理をする際に役立つかもしれないよ。
4.3 エラーには何が含まれるのか
例外オブジェクトにはエラー情報が含まれているんだ。例外のタイプによって、オブジェクトにはいろいろな属性が含まれている可能性があるよ。
多くの例外で利用できる一般的な属性をいくつか紹介するね:
-
args: 例外作成時に渡された引数を含むタプル。通常、エラーメッセージだよ。 -
message: エラーメッセージを含む文字列(いくつかの例外で)。 -
__str__: 例外の文字列表現を返すメソッド。このメソッドは、print()関数で例外オブジェクトを表示する際に使われるテキスト表現を返すためのものだよ。
例:
try:
# ValueErrorが発生するかもしれないコード
result = int("abc")
except ValueError as e:
print(f"エラーが発生しました: {e}")
print(f"エラーの引数: {e.args}")
print(f"エラーメッセージ: {str(e)}")
複数例外の処理例
try:
# 複数のタイプの例外が発生するかもしれないコード
result = 10 / 0
except (ValueError, ZeroDivisionError) as e:
print(f"エラーが発生しました: {e}")
print(f"エラーのタイプ: {type(e)}")
print(f"エラーの引数: {e.args}")
ValueErrorやZeroDivisionErrorが発生した場合、それはexceptブロックでキャッチされるよ。例外情報はe変数を通じてアクセスできるんだ。出力にはエラーのタイプと、例外作成時に渡された引数が含まれるよ。
GO TO FULL VERSION