組み込み例外¶
Python において、すべての例外は BaseException
から派生したクラスのインスタンスでなければなりません。特定のクラスを言及する except
節を伴う try
文において、その節はそのクラスから派生した例外クラスも処理しますが、そのクラスの派生 元 の例外クラスは処理しません。サブクラス化の関係にない 2 つの例外クラスは、それらが同じ名前だった場合でも等しくなりえません。
この章で挙げる組み込み例外は、インタプリタや組み込み関数によって生成されます。特に注記しないかぎり、これらはエラーの詳しい原因を示す "関連値 (associated value)" を持ちます。この値は、複数の情報 (エラーコードや、そのコードを説明する文字列など) の文字列かタプルです。関連値は通常、例外クラスのコンストラクタに引数として渡されます。
ユーザによるコードも組み込み例外を送出できます。これを使って、例外ハンドラをテストしたり、インタプリタが同じ例外を送出する状況と "ちょうど同じような" エラー条件であることを報告したりできます。しかし、ユーザのコードが適切でないエラーを送出するのを妨げる方法はないので注意してください。
組み込み例外クラスは新たな例外を定義するためにサブクラス化することができます。新しい例外は、Exception
クラスかそのサブクラスの一つから派生することをお勧めします。 BaseException
からは派生しないで下さい。例外を定義する上での詳しい情報は、 Python チュートリアルの ユーザー定義例外 の項目にあります。
例外コンテキスト¶
例外オブジェクトの3つの属性は、例外が送出された常用に関する情報を提供します:
- BaseException.__context__¶
- BaseException.__cause__¶
- BaseException.__suppress_context__¶
When raising a new exception while another exception is already being handled, the new exception's
__context__
attribute is automatically set to the handled exception. An exception may be handled when anexcept
orfinally
clause, or awith
statement, is used.This implicit exception context can be supplemented with an explicit cause by using
from
withraise
:raise new_exc from original_exc
from
に続く式は例外かNone
でなくてはなりません。 式は送出される例外の__cause__
として設定されます。__cause__
を設定することは、__suppress_context__
属性を暗黙的にTrue
に設定することにもなるので、raise new_exc from None
を使うことで効率的に古い例外を新しいもので置き換えて表示する (例えば、KeyError
をAttributeError
に置き換え)、古い例外はデバッグ時の調査で使えるよう__context__
に残すことができます。デフォルトの traceback 表示コードは、例外自体の traceback に加え、これらの連鎖された例外を表示します。
__cause__
で明示的に連鎖させた例外は、存在するならば常に表示されます。__context__
で暗黙に連鎖させた例外は、__cause__
がNone
かつ__suppress_context__
が false の場合にのみ表示されます。いずれにせよ、連鎖された例外に続いて、その例外自体は常に表示されます。そのため、traceback の最終行には、常に送出された最後の例外が表示されます。
組み込み例外から継承する¶
User code can create subclasses that inherit from an exception type.
It's recommended to only subclass one exception type at a time to avoid
any possible conflicts between how the bases handle the args
attribute, as well as due to possible memory layout incompatibilities.
CPython 実装の詳細: Most built-in exceptions are implemented in C for efficiency, see: Objects/exceptions.c. Some have custom memory layouts which makes it impossible to create a subclass that inherits from multiple exception types. The memory layout of a type is an implementation detail and might change between Python versions, leading to new conflicts in the future. Therefore, it's recommended to avoid subclassing multiple exception types altogether.
基底クラス¶
以下の例外は、主に他の例外の基底クラスとして使われます。
- exception BaseException¶
全ての組み込み例外の基底クラスです。ユーザ定義の例外に直接継承されることは意図されていません (継承には
Exception
を使ってください)。このクラスのインスタンスにstr()
が呼ばれた場合、インスタンスへの引数の表現か、引数が無い場合には空文字列が返されます。- args¶
例外コンストラクタに与えられた引数のタプルです。組み込み例外は普通、エラーメッセージを与える一つの文字列だけを引数として呼ばれますが、中には (
OSError
など) いくつかの引数を必要とし、このタプルの要素に特別な意味を込めるものもあります。
- with_traceback(tb)¶
This method sets tb as the new traceback for the exception and returns the exception object. It was more commonly used before the exception chaining features of PEP 3134 became available. The following example shows how we can convert an instance of
SomeException
into an instance ofOtherException
while preserving the traceback. Once raised, the current frame is pushed onto the traceback of theOtherException
, as would have happened to the traceback of the originalSomeException
had we allowed it to propagate to the caller.try: ... except SomeException: tb = sys.exception().__traceback__ raise OtherException(...).with_traceback(tb)
- __traceback__¶
A writable field that holds the traceback object associated with this exception. See also: raise 文.
- add_note(note)¶
例外のノートとして文字列
note
を追加します。ノートは標準のトレースバックで例外文字列の後に表示されます。note
が文字列以外の場合TypeError
が送出されます。Added in version 3.11.
- __notes__¶
add_note()
で追加された例外のノートのリスト。この属性はadd_note()
を呼び出すと生成されます。Added in version 3.11.
- exception Exception¶
システム終了以外の全ての組み込み例外はこのクラスから派生しています。全てのユーザ定義例外もこのクラスから派生させるべきです。
- exception ArithmeticError¶
算術上の様々なエラーに対して送出される組み込み例外
OverflowError
,ZeroDivisionError
,FloatingPointError
の基底クラスです。
- exception LookupError¶
マッピングまたはシーケンスで使われたキーやインデクスが無効な場合に送出される例外
IndexError
およびKeyError
の基底クラスです。codecs.lookup()
によって直接送出されることもあります。
具象例外¶
以下の例外は、通常送出される例外です。
- exception AttributeError¶
属性参照 (属性参照 を参照) や代入が失敗した場合に送出されます (オブジェクトが属性の参照や属性の代入をまったくサポートしていない場合には
TypeError
が送出されます)。コンストラクタのキーワード専用引数を使って
name
およびobj
属性を設定できます。設定された場合、アクセスが試みられた属性の名前と、その属性にアクセスしたオブジェクトを、それぞれ表します。バージョン 3.10 で変更:
name
およびobj
属性が追加されました。
- exception EOFError¶
input()
が何もデータを読まずに end-of-file (EOF) に達した場合に送出されます。(注意:io.IOBase.read()
とio.IOBase.readline()
メソッドは、EOF に達すると空文字列を返します。)
- exception FloatingPointError¶
現在は使われていません。
- exception GeneratorExit¶
ジェネレータ や コルーチン が閉じられたときに送出されます。
generator.close()
とcoroutine.close()
を参照してください。この例外は厳密に言えばエラーではないので、Exception
ではなくBaseException
を直接継承しています。
- exception ImportError¶
import
文でモジュールをロードしようとして問題が発生すると送出されます。from ... import
の中の"from list" (訳注:...
の部分)の名前が見つからないときにも送出されます。オブションのキーワード専用引数 name と path は、対応する属性に設定されます:
- name¶
インポートを試みたモジュールの名前。
- path¶
例外を引き起こしたファイルのパス。
- exception ModuleNotFoundError¶
ImportError
のサブクラスで、import
文でモジュールが見つからない場合に送出されます。また、sys.modules
にNone
が含まれる場合にも送出されます。Added in version 3.6.
- exception IndexError¶
シーケンスの添字が範囲外の場合に送出されます。 (スライスのインデクスはシーケンスの範囲に収まるように暗黙のうちに調整されます; インデクスが整数でない場合、
TypeError
が送出されます。)
- exception KeyError¶
マッピング (辞書) のキーが、既存のキーの集合内に見つからなかった場合に送出されます。
- exception KeyboardInterrupt¶
ユーザが割り込みキー (通常は Control-C または Delete) を押した場合に送出されます。実行中、割り込みは定期的に監視されます。
Exception
を捕捉するコードに誤って捕捉されてインタプリタの終了が阻害されないように、この例外はBaseException
を継承しています。注釈
Catching a
KeyboardInterrupt
requires special consideration. Because it can be raised at unpredictable points, it may, in some circumstances, leave the running program in an inconsistent state. It is generally best to allowKeyboardInterrupt
to end the program as quickly as possible or avoid raising it entirely. (See Note on Signal Handlers and Exceptions.)
- exception MemoryError¶
ある操作中にメモリが不足したが、その状況は (オブジェクトをいくつか消去することで) まだ復旧可能かもしれない場合に送出されます。この例外の関連値は、メモリ不足になった (内部) 操作の種類を示す文字列です。下層のメモリ管理アーキテクチャ (C の
malloc()
関数) のために、インタプリタが現状から完璧に復旧できるとはかぎらないので注意してください。それでも、プログラムの暴走が原因の場合に備えて実行スタックのトレースバックを出力できるように、例外が送出されます。
- exception NameError¶
ローカルまたはグローバルの名前が見つからなかった場合に送出されます。これは非修飾の (訳注:
spam.egg
ではなく単にegg
のような) 名前のみに適用されます。関連値は見つからなかった名前を含むエラーメッセージです。コンストラクタのキーワード専用引数を使って
name
属性を設定できます。設定された場合、アクセスが試みられた変数の名前を表します。バージョン 3.10 で変更:
name
属性が追加されました。
- exception NotImplementedError¶
この例外は
RuntimeError
から派生しています。ユーザ定義の基底クラスにおいて、抽象メソッドが派生クラスでオーバライドされることを要求する場合にこの例外を送出しなくてはなりません。またはクラスは実装中であり本来の実装を追加する必要があることを示します。注釈
演算子やメソッドがサポートされていないことを示す目的でこの例外を使用するべきではありません。そのようなケースではオペレータやメソッドを未定義のままとするか、サブクラスの場合は
None
を設定してください。注釈
NotImplementedError
とNotImplemented
は、似たような名前と目的を持っていますが、相互に変換できません。 利用する際には、NotImplemented
を参照してください。
- exception OSError([arg])¶
- exception OSError(errno, strerror[, filename[, winerror[, filename2]]])
この例外はシステム関数がシステム関連のエラーを返した場合に送出されます。例えば "file not found" や "disk full" のような I/O の失敗が発生したときです (引数の型が不正な場合や、他の偶発的なエラーは除きます)。
コンストラクタの2番目の形式は下記の対応する属性を設定します。指定されなかった場合属性はデフォルトで
None
です。後方互換性のために、引数が3つ渡された場合、args
属性は最初の2つの要素のみからなるタプルを持ちます。コンストラクタは実際には、 OS exceptions で述べられている
OSError
のサブクラスを返すことがよくあります。特定のサブクラスは最終的なerrno
値によります。この挙動はOSError
を直接またはエイリアスで構築し、サブクラス化時に継承されなかった場合にのみ発生します。- errno¶
C 変数
errno
に由来する数値エラーコードです。
- winerror¶
Windows において、ネイティブ Windows エラーコードを与えます。そして
errno
属性は POSIX でいうネイティブエラーコードへのおよその翻訳です。Windows では、winerror コンストラクタ引数が整数の場合
errno
属性は Windows エラーコードから決定され、errno 引数は無視されます。他のプラットフォームでは winerror 引数は無視され、winerror
属性は存在しません。
- strerror¶
OS が提供するような、対応するエラーメッセージです。 POSIX では
perror()
で、Windows ではFormatMessage()
で体裁化されます。
- filename¶
- filename2¶
ファイルシステムパスが1つ関与する例外 (例えば
open()
やos.unlink()
) の場合、filename
は関数に渡されたファイル名です。 ファイルシステムパスが2つ関与する関数 (例えばos.rename()
) の場合、filename2
は関数に渡された2つ目のファイル名です。
バージョン 3.3 で変更:
EnvironmentError
,IOError
,WindowsError
,socket.error
,select.error
,mmap.error
がOSError
に統合されました。コンストラクタはサブクラスを返すかもしれません。バージョン 3.4 で変更:
filename
属性が filesystem encoding and error handler のエンコーディングでエンコードやデコードされた名前から、関数に渡された元々のファイル名になりました。 また、filename2 コンストラクタ引数が追加されました。
- exception OverflowError¶
算術演算の結果が表現できない大きな値になった場合に送出されます。これは整数では起こりません (むしろ
MemoryError
が送出されることになるでしょう)。しかし、歴史的な理由のため、要求された範囲の外の整数に対して OverflowError が送出されることがあります。C の浮動小数点演算の例外処理は標準化されていないので、ほとんどの浮動小数点演算もチェックされません。
- exception PythonFinalizationError¶
This exception is derived from
RuntimeError
. It is raised when an operation is blocked during interpreter shutdown also known as Python finalization.Examples of operations which can be blocked with a
PythonFinalizationError
during the Python finalization:Creating a new Python thread.
sys.is_finalizing()
関数も参照してください。Added in version 3.13: 以前は
RuntimeError
をそのまま送出していました。
- exception RecursionError¶
この例外は
RuntimeError
を継承しています。インタープリタが最大再帰深度 (sys.getrecursionlimit()
を参照) の超過を検出すると送出されます。Added in version 3.5: 以前は
RuntimeError
をそのまま送出していました。
- exception ReferenceError¶
weakref.proxy()
によって生成された弱参照 (weak reference) プロキシを使って、ガーベジコレクションによって回収された後の参照対象オブジェクトの属性にアクセスした場合に送出されます。弱参照についてはweakref
モジュールを参照してください。
- exception RuntimeError¶
他のカテゴリに分類できないエラーが検出された場合に送出されます。関連値は、何が問題だったのかをより詳細に示す文字列です。
- exception StopIteration¶
組込み関数
next()
と iterator の__next__()
メソッドによって、そのイテレータが生成するアイテムがこれ以上ないことを伝えるために送出されます。generator や coroutine 関数が返るとき、新しい
StopIteration
インスタンスが送出されます。 関数の返り値は例外のコンストラクタのvalue
引数として使われます。ジェネレータのコードが直接的あるいは間接的に
StopIteration
を送出する場合は、RuntimeError
に変換されます (StopIteration
は変換後の例外の原因として保持されます)。バージョン 3.3 で変更:
value
属性とジェネレータ関数が値を返すためにそれを使う機能が追加されました。バージョン 3.5 で変更:
from __future__ import generator_stop
による RuntimeError への変換が導入されました。 PEP 479 を参照してください。バージョン 3.7 で変更: PEP 479 が全てのコードでデフォルトで有効化されました: ジェネレータから送出された
StopIteration
はRuntimeError
に変換されます。
- exception StopAsyncIteration¶
イテレーションを停止するために、 asynchronous iterator オブジェクトの
__anext__()
メソッドによって返される必要があります。Added in version 3.5.
- exception SyntaxError(message, details)¶
パーザが構文エラーに遭遇した場合に送出されます。この例外は
import
文、組み込み関数compile()
、exec()
やeval()
、初期化スクリプトの読み込みや標準入力で (対話的な実行時にも) 起こる可能性があります。例外インスタンスの
str()
はエラーメッセージのみを返します。詳細はタプルで、個々の属性としても利用できます。- filename¶
構文エラーが発生したファイルの名前。
- lineno¶
ファイルのエラーが発生した行番号。1から数えはじめるため、ファイルの最初の行の
lineno
は1です。
- offset¶
行のエラーが発生した列番号。1から数えはじめるため、行の最初の文字の
offset
は1です。
- text¶
エラーを含むソースコードのテキスト。
- end_lineno¶
ファイルのエラーが発生した最後の行番号。1から数えはじめるため、ファイルの最初の行の
lineno
は1です。
- end_offset¶
行のエラーが発生した最後の列番号。1から数えはじめるため、行の最初の文字の
offset
は1です。
For errors in f-string fields, the message is prefixed by "f-string: " and the offsets are offsets in a text constructed from the replacement expression. For example, compiling f'Bad {a b} field' results in this args attribute: ('f-string: ...', ('', 1, 2, '(a b)n', 1, 5)).
バージョン 3.10 で変更:
end_lineno
およびend_offset
属性が追加されました。
- exception IndentationError¶
正しくないインデントに関する構文エラーの基底クラスです。これは
SyntaxError
のサブクラスです。
- exception TabError¶
タブとスペースを一貫しない方法でインデントに使っているときに送出されます。これは
IndentationError
のサブクラスです。
- exception SystemError¶
インタプリタが内部エラーを発見したが、状況は全ての望みを棄てさせるほど深刻ではないと思われる場合に送出されます。関連値は (下位層で) どの動作が失敗したかを示す文字列です。
使用中の Python インタプリタの作者または保守担当者にこのエラーを報告してください。このとき、Python インタプリタのバージョン (
sys.version
。Python の対話的セッションを開始した際にも出力されます)、正確なエラーメッセージ (例外の関連値) を忘れずに報告してください。可能な場合にはエラーを引き起こしたプログラムのソースコードも報告してください。
- exception SystemExit¶
この例外は
sys.exit()
関数から送出されます。Exception
をキャッチするコードに誤ってキャッチされないように、Exception
ではなくBaseException
を継承しています。これにより例外は上の階層に適切に伝わり、インタープリタを終了させます。この例外が処理されなかった場合はスタックのトレースバックを表示せずに Python インタープリタは終了します。コンストラクタはsys.exit()
に渡されるオプション引数と同じものを受け取ります。値が整数の場合、システムの終了ステータス (C 言語のexit()
関数に渡すもの)を指定します。値がNone
の場合、終了ステータスは 0 です。それ以外の型の場合 (例えば str)、 オブジェクトの値が表示され、終了ステータスは 1 です。sys.exit()
は、クリーンアップのための処理 (try
文のfinally
節) が実行されるようにするため、またデバッガが制御不能になるリスクを冒さずにスクリプトを実行できるようにするために例外に変換されます。即座に終了することが真に強く必要であるとき (例えば、os.fork()
を呼んだ後の子プロセス内) にはos._exit()
関数を使うことができます。- code¶
コンストラクタに渡された終了ステータス又はエラーメッセージ。(デフォルトは
None
)
- exception TypeError¶
組み込み演算または関数が適切でない型のオブジェクトに対して適用された際に送出されます。関連値は型の不整合に関して詳細を述べた文字列です。
この例外は、そのオブジェクトで実行しようとした操作がサポートされておらず、その予定もない場合にユーザーコードから送出されるかもしれません。オブジェクトでその操作をサポートするつもりだが、まだ実装を提供していないのであれば、送出する適切な例外は
NotImplementedError
です。誤った型の引数が渡された場合は (例えば、
int
が期待されるのに、list
が渡された)TypeError
となるべきです。しかし、誤った値(例えば、期待する範囲外の数)が引数として渡された場合は、ValueError
となるべきです。
- exception UnboundLocalError¶
関数やメソッド内のローカルな変数に対して参照を行ったが、その変数には値が代入されていなかった場合に送出されます。
NameError
のサブクラスです。
- exception UnicodeError¶
Unicode に関するエンコードまたはデコードのエラーが発生した際に送出されます。
ValueError
のサブクラスです。UnicodeError
はエンコードまたはデコードのエラーの説明を属性として持っています。例えば、err.object[err.start:err.end]
は、無効な入力のうちコーデックが処理に失敗した箇所を表します。- encoding¶
エラーを送出したエンコーディングの名前です。
- reason¶
そのコーデックエラーを説明する文字列です。
- object¶
コーデックがエンコードまたはデコードしようとしたオブジェクトです。
- exception UnicodeEncodeError¶
Unicode 関連のエラーがエンコード中に発生した際に送出されます。
UnicodeError
のサブクラスです。
- exception UnicodeDecodeError¶
Unicode 関連のエラーがデコード中に発生した際に送出されます。
UnicodeError
のサブクラスです。
- exception UnicodeTranslateError¶
Unicode 関連のエラーが変換中に発生した際に送出されます。
UnicodeError
のサブクラスです。
- exception ValueError¶
演算子や関数が、正しい型だが適切でない値を持つ引数を受け取ったときや、
IndexError
のようなより詳細な例外では記述できない状況で送出されます。
- exception ZeroDivisionError¶
除算や剰余演算の第二引数が 0 であった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。
以下の例外は、過去のバージョンとの後方互換性のために残されています; Python 3.3 より、これらは OSError
のエイリアスです。
- exception EnvironmentError¶
- exception IOError¶
- exception WindowsError¶
Windows でのみ利用できます。
OS 例外¶
以下の例外は OSError
のサブクラスで、システムエラーコードに依存して送出されます。
- exception BlockingIOError¶
ある操作が、ノンブロッキング操作に設定されたオブジェクト (例えばソケット) をブロックしそうになった場合に送出されます。
errno
EAGAIN
,EALREADY
,EWOULDBLOCK
およびEINPROGRESS
に対応します。BlockingIOError
は、OSError
の属性に加えて一つの属性を持ちます:
- exception ConnectionError¶
コネクション関係の問題の基底クラス。
サブクラスは
BrokenPipeError
,ConnectionAbortedError
,ConnectionRefusedError
,ConnectionResetError
です。
- exception BrokenPipeError¶
ConnectionError
のサブクラスで、もう一方の端が閉じられたパイプに書き込こもうとするか、書き込みのためにシャットダウンされたソケットに書き込こもうとした場合に発生します。errno
EPIPE
とESHUTDOWN
に対応します。
- exception ConnectionAbortedError¶
ConnectionError
のサブクラスで、接続の試行が通信相手によって中断された場合に発生します。errno
ECONNABORTED
に対応します。
- exception ConnectionRefusedError¶
ConnectionError
のサブクラスで、接続の試行が通信相手によって拒否された場合に発生します。errno
ECONNREFUSED
に対応します。
- exception ConnectionResetError¶
ConnectionError
のサブクラスで、接続が通信相手によってリセットされた場合に発生します。errno
ECONNRESET
に対応します。
- exception InterruptedError¶
システムコールが入力信号によって中断された場合に送出されます。
errno
EINTR
に対応します。バージョン 3.5 で変更: シグナルハンドラが例外を送出せず、システムコールが信号で中断された場合 Python は
InterruptedError
を送出する代わりにシステムコールを再試行するようになりました (論拠については PEP 475 を参照してください) 。
- exception IsADirectoryError¶
ディレクトリに (
os.remove()
などの) ファイル操作が要求された場合に送出されます。errno
EISDIR
に対応します。
- exception NotADirectoryError¶
ディレクトリへの操作(たとえば
os.listdir()
)をディレクトリ以外に対して要求された場合に送出されます。多くのPOSIXプラットフォームではディレクトリではないファイルをディレクトリとして開いたり移動するときにも発生する場合があります。errno
ENOTDIR
に対応します。
- exception PermissionError¶
十分なアクセス権、例えばファイルシステム権限のない操作が試みられた場合に送出されます。
errno
EACCES
、EPERM
およびENOTCAPABLE
に対応します。バージョン 3.11.1 で変更: WASIの
ENOTCAPABLE
はPermissionError
にマップされました。
Added in version 3.3: 上記のすべての OSError
サブクラスが追加されました。
参考
PEP 3151 - OS および IO 例外階層の手直し
警告¶
次の例外は警告カテゴリとして使われます。詳細については 警告カテゴリ のドキュメントを参照してください。
- exception Warning¶
警告カテゴリの基底クラスです。
- exception UserWarning¶
ユーザコードによって生成される警告の基底クラスです。
- exception DeprecationWarning¶
他の Python 開発者へ向けて警告を発するときの、廃止予定の機能についての警告の基底クラスです。
__main__
モジュールを除いて(PEP 565)、デフォルトの警告フィルターで無効化されています。Python Development Mode を有効にするとこの警告が表示されます。The deprecation policy is described in PEP 387.
- exception PendingDeprecationWarning¶
古くなって将来的に廃止される予定だが、今のところは廃止されていない機能についての警告の基底クラスです。
近々起こる可能性のある機能廃止について警告を発することはまれなので、このクラスはめったに使われず、既に決まっている廃止については
DeprecationWarning
が望ましいです。デフォルトの警告フィルターで無効化されています。Python Development Mode を有効にするとこの警告が表示されます。
The deprecation policy is described in PEP 387.
- exception SyntaxWarning¶
曖昧な構文に対する警告の基底クラスです。
- exception RuntimeWarning¶
あいまいなランタイム挙動に対する警告の基底クラスです。
- exception FutureWarning¶
Python で書かれたアプリケーションのエンドユーザーへ向けて警告を発するときの、廃止予定の機能についての警告の基底クラスです。
- exception ImportWarning¶
モジュールインポートの誤りと思われるものに対する警告の基底クラスです。
デフォルトの警告フィルターで無効化されています。Python Development Mode を有効にするとこの警告が表示されます。
- exception UnicodeWarning¶
Unicode に関連した警告の基底クラスです。
- exception EncodingWarning¶
エンコーディングに関連した警告の基底クラスです。
詳細は Opt-in EncodingWarning を参照してください。
Added in version 3.10.
- exception ResourceWarning¶
リソースの使用に関連した警告の基底クラスです。
デフォルトの警告フィルターで無効化されています。Python Development Mode を有効にするとこの警告が表示されます。
Added in version 3.2.
例外グループ¶
以下は関係がない複数の例外を送出する必要があるときに使用します。例外グループは例外の階層構造の一部のため、他の例外と同様 except
で処理できます。また、except*
によって判別でき、例外グループに含まれている例外の型に基づいてサブグループにマッチします。
- exception ExceptionGroup(msg, excs)¶
- exception BaseExceptionGroup(msg, excs)¶
この2つの例外型は一連の例外
excs
を包含します。msg
引数は文字列の必要があります。2つのクラスの異なる点は、BaseException
はBaseExceptionGroup
を拡張して任意の例外を含められますが、ExceptionGroup
はException
を拡張してException
のサブクラスのみを含められます。この設計によりexcept Exception
はExceptionGroup
をキャッチしますが、BaseExceptionGroup
はキャッチしません。BaseExceptionGroup
のコンストラクターは含まれる例外がすべてException
の場合はBaseExceptionGroup
ではなくExceptionGroup
を返すように自動的に選択されます。一方ExceptionGroup
コンストラクタは、Exception
サブクラス以外の例外を含む場合はTypeError
を送出します。- message¶
コンストラクタの
msg
引数。この属性は読み込み専用です。
- exceptions¶
コンストラクタに渡された一連の
excs
に含まれる例外のタプルです。この属性は読み込み専用です。
- subgroup(condition)¶
現在のグループで 条件 にマッチする礼儀のみを含む例外グループを返します。結果が空の場合は
None
を返します。The condition can be an exception type or tuple of exception types, in which case each exception is checked for a match using the same check that is used in an
except
clause. The condition can also be a callable (other than a type object) that accepts an exception as its single argument and returns true for the exceptions that should be in the subgroup.The nesting structure of the current exception is preserved in the result, as are the values of its
message
,__traceback__
,__cause__
,__context__
and__notes__
fields. Empty nested groups are omitted from the result.The condition is checked for all exceptions in the nested exception group, including the top-level and any nested exception groups. If the condition is true for such an exception group, it is included in the result in full.
Added in version 3.13:
condition
can be any callable which is not a type object.
- split(condition)¶
subgroup()
と似てますが(match, rest)
のペアを返します。match
はsubgroup(condition)
でrest
は残りのマッチしない部分です。
- derive(excs)¶
同じ
message
の例外グループを返しますが、excs
の例外を含んでいます。This method is used by
subgroup()
andsplit()
, which are used in various contexts to break up an exception group. A subclass needs to override it in order to makesubgroup()
andsplit()
return instances of the subclass rather thanExceptionGroup
.subgroup()
とsplit()
は__traceback__
、__cause__
、__context__
と__notes__
フィールドを元の例外グループからderive()
が返す例外グループにコピーするため、derive()
ではこれらのフィールドを更新する必要がありません。>>> class MyGroup(ExceptionGroup): ... def derive(self, excs): ... return MyGroup(self.message, excs) ... >>> e = MyGroup("eg", [ValueError(1), TypeError(2)]) >>> e.add_note("a note") >>> e.__context__ = Exception("context") >>> e.__cause__ = Exception("cause") >>> try: ... raise e ... except Exception as e: ... exc = e ... >>> match, rest = exc.split(ValueError) >>> exc, exc.__context__, exc.__cause__, exc.__notes__ (MyGroup('eg', [ValueError(1), TypeError(2)]), Exception('context'), Exception('cause'), ['a note']) >>> match, match.__context__, match.__cause__, match.__notes__ (MyGroup('eg', [ValueError(1)]), Exception('context'), Exception('cause'), ['a note']) >>> rest, rest.__context__, rest.__cause__, rest.__notes__ (MyGroup('eg', [TypeError(2)]), Exception('context'), Exception('cause'), ['a note']) >>> exc.__traceback__ is match.__traceback__ is rest.__traceback__ True
Note that
BaseExceptionGroup
defines__new__()
, so subclasses that need a different constructor signature need to override that rather than__init__()
. For example, the following defines an exception group subclass which accepts an exit_code and and constructs the group's message from it.class Errors(ExceptionGroup): def __new__(cls, errors, exit_code): self = super().__new__(Errors, f"exit code: {exit_code}", errors) self.exit_code = exit_code return self def derive(self, excs): return Errors(excs, self.exit_code)
Like
ExceptionGroup
, any subclass ofBaseExceptionGroup
which is also a subclass ofException
can only wrap instances ofException
.Added in version 3.11.
例外のクラス階層¶
組み込み例外のクラス階層は以下のとおりです:
BaseException
├── BaseExceptionGroup
├── GeneratorExit
├── KeyboardInterrupt
├── SystemExit
└── Exception
├── ArithmeticError
│ ├── FloatingPointError
│ ├── OverflowError
│ └── ZeroDivisionError
├── AssertionError
├── AttributeError
├── BufferError
├── EOFError
├── ExceptionGroup [BaseExceptionGroup]
├── ImportError
│ └── ModuleNotFoundError
├── LookupError
│ ├── IndexError
│ └── KeyError
├── MemoryError
├── NameError
│ └── UnboundLocalError
├── OSError
│ ├── BlockingIOError
│ ├── ChildProcessError
│ ├── ConnectionError
│ │ ├── BrokenPipeError
│ │ ├── ConnectionAbortedError
│ │ ├── ConnectionRefusedError
│ │ └── ConnectionResetError
│ ├── FileExistsError
│ ├── FileNotFoundError
│ ├── InterruptedError
│ ├── IsADirectoryError
│ ├── NotADirectoryError
│ ├── PermissionError
│ ├── ProcessLookupError
│ └── TimeoutError
├── ReferenceError
├── RuntimeError
│ ├── NotImplementedError
│ ├── PythonFinalizationError
│ └── RecursionError
├── StopAsyncIteration
├── StopIteration
├── SyntaxError
│ └── IndentationError
│ └── TabError
├── SystemError
├── TypeError
├── ValueError
│ └── UnicodeError
│ ├── UnicodeDecodeError
│ ├── UnicodeEncodeError
│ └── UnicodeTranslateError
└── Warning
├── BytesWarning
├── DeprecationWarning
├── EncodingWarning
├── FutureWarning
├── ImportWarning
├── PendingDeprecationWarning
├── ResourceWarning
├── RuntimeWarning
├── SyntaxWarning
├── UnicodeWarning
└── UserWarning