Pythonにおける例外処理は、プログラムが予期しないエラーに対処するための重要な部分です。具体的なケースとして、ファイルが存在しない場合やデータベースへの接続が失敗する場合などがあります。
基本的な例外処理
Pythonでの例外処理は try
, except
, finally
ブロックを使用します。
try:
# エラーが発生する可能性があるコード
result = 10 / 0
except ZeroDivisionError:
# エラーが発生した場合の処理
print("0で割ることはできません")
finally:
# エラーが発生しようとしまいと実行されるコード
print("処理が完了しました")
複数の例外処理
複数のエラーを捕捉することもできます。
try:
# エラーが発生する可能性があるコード
result = 10 / 0
except ZeroDivisionError:
print("0で割ることはできません")
except FileNotFoundError:
print("ファイルが見つかりません")
finally:
print("処理が完了しました")
エラーの詳細情報
エラーの詳細な情報も取得することができます。
try:
result = 10 / 0
except ZeroDivisionError as e:
print(f"エラーが発生しました: {e}")
このコードを実行すると、0で割り算をしているため ZeroDivisionError
が発生し、以下のメッセージが表示されます:
エラーが発生しました: division by zero
e
変数に割り当てられたエラーオブジェクトは、エラーの型(この場合は ZeroDivisionError
)だけでなく、エラーメッセージ(この場合は”division by zero”)などの詳細情報も含んでいます。この機能は、エラーロギングやエラー報告に非常に便利です。
組み込み例外
Pythonにおいて、すべての例外は BaseException
から派生したクラスのインスタンスでなければなりません。特定のクラスを言及する except
節を伴う try
文において、その節はそのクラスから派生した例外クラスも処理しますが、そのクラスの派生元の例外クラスは処理しません。
例外のコンテキスト
例外オブジェクトには、例外が発生したコンテキストに関する情報を提供する3つの属性があります:BaseException.__context__
、BaseException.__cause__
、BaseException.__suppress_context__
。
新しい例外を送出する際に別の例外がすでに処理されている場合、新しい例外の __context__
属性は自動的に処理されている例外に設定されます。例外は、except
や finally
節、または with
文が使用されると処理される可能性があります。
この暗黙の例外コンテキストは、raise
に from
を使用して明示的な原因を補足することで補完することができます:
raise new_exc from original_exc
from
に続く式は例外か None
でなくてはなりません。式は送出される例外の __cause__
として設定されます。__cause__
を設定することは、 __suppress_context__
属性を暗黙的に True
に設定することにもなるので、 raise new_exc from None
を使うことで効率的に古い例外を新しいもので置き換えて表示する。
組み込み例外から継承する
ユーザーコードは、例外タイプから継承するサブクラスを作成できます。一度に一つの例外タイプだけをサブクラス化することをお勧めします。
以上がPythonの例外処理とその属性についての基本的な解説です。これらの知識を持っておくことで、より堅牢なPythonプログラムを作成することができます。.