raise文を使って例外を送出する基本的な方法と例外の連鎖、例外の置き換えなどについて紹介する。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
class SomeError(Exception):
pass
def some_func():
raise SomeError
# 例外クラスを指定しないraise文
try:
# 例外を発生させる可能性があるコード
some_func()
except SomeError as e:
# 例外処理時にその例外を再送出
raise
# raise文に例外クラスを渡す
try:
raise SomeError
except SomeError as e:
print(e)
# raise文に例外クラスのインスタンスを渡す
try:
raise SomeError('sample exception')
except SomeError as e:
print(e) # sample exception
# 例外の連鎖
try:
raise IndexError('occurred in try')
except IndexError as e:
print(e) # occurred in try
raise TypeError('occurred in except')
# 出力結果:
#occurred in try
#Traceback (most recent call last):
# File "<stdin>", line 2, in <module>
#IndexError: occurred in try
#
#During handling of the above exception, another exception occurred:
#
#Traceback (most recent call last):
# File "<stdin>", line 5, in <module>
#TypeError: occurred in except
# 例外の置き換え
try:
raise IndexError('occurred in try')
except IndexError as e:
raise SomeError('occurred in except') from IndexError
# 出力結果:
#IndexError
#
#The above exception was the direct cause of the following exception:
#
#Traceback (most recent call last):
# File "<stdin>", line 4, in <module>
#SomeError: occurred in except
# 例外の置き換えで例外オブジェクトを使用する
try:
raise IndexError('occurred in try')
except IndexError as e:
raise SomeError('occurred in except') from e
# 出力結果:
#Traceback (most recent call last):
# File "<stdin>", line 2, in <module>
#IndexError: occurred in try
#
#The above exception was the direct cause of the following exception:
#
#Traceback (most recent call last):
# File "<stdin>", line 4, in <module>
#SomeError: occurred in except
プログラムの実行時にその場では対処が不可能な状況に陥ったら、そのコードを呼び出した側がその状況に対処することを期待して、例外を送出できる。本稿では以下について紹介する。
例外を送出するにはraise文を使用する。raise文には例外クラスやそのインスタンスを渡せる。渡さない場合は、現在処理をしている例外(アクティブな例外)が再送出される。
raise
この書き方は発生した例外を処理している際に、以下のように再度同じ例外を送出するために使われる。
class SomeError(Exception):
pass
def some_func():
raise SomeError
try:
# 例外を発生させる可能性があるコード
some_func()
except SomeError as e:
# 例外処理時にその例外を再送出
raise
他の構文ではraise文に渡せるのは例外クラス、つまりBaseExceptionクラスやその他の例外クラスから派生するクラスだけである。以下に構文を示す。
raise 例外クラス
raise 例外クラス(引数)
次の「raise 例外クラス」はその例外クラスのインスタンスを引数なしで作成したものが呼び出し側へと伝播される。「raise 例外クラス(引数)」は指定した引数で例外クラスのインスタンスを生成し、それが呼び出し側へと伝播される。何らかの情報を例外クラスのインスタンスに付加したいのであれば後者の形を使うことになる。
try:
raise SomeError # 例外クラスを渡す
except SomeError as e:
print(e)
try:
raise SomeError('sample exception') # 例外クラスのインスタンスを渡す
except SomeError as e:
print(e) # sample exception
例外処理の途中で新たな例外が発生した場合、元の例外の情報が新しい例外に原因としてアタッチされる。
Copyright© Digital Advantage Corp. All Rights Reserved.