【SikuliX】【Python】例外の種類について、まとめました~前編~

プログラム実行中に考慮しなくてはいけないことの1つに、エラーや例外の処理があります。
Pythonの例外処理は、「try」「except」などを使って行います。
「except」では、例外の種類によって処理する内容を変えることもでき、例外の内容を知っておくことは重要になってくるでしょう。
今回は、そんな例外の種類について、すでにPythonの中に備わっている第三階層までについて説明をしていきます。
なお、量が多いので、複数の文書にわたって記載します。(後編は、こちら:リンク
スポンサーリンク

例外の構造

Pythonにおける例外は、自身で自由に作成することもできますが、すでにPythonの中に備わっている既存の例外が多くあります。

なお個々で作成しても、元々Pythonに備わっている例外でも、これらは全て「BaseException」が基になった階層構造を取ります。

「BaseException」を親とする例外は、大きく以下のような4つから成っていますなります。

BaseException
 |– SystemExit
 |– KeyboardInterrupt
 |– GeneratorExit
 |– Exception

そして、最後の「Exception」の下には、更に以下のように様々な例外がぶら下がっています。

また、この中でさらに下の階層がある例外もあります。

|– Exception
  |– ArithmeticError
  |– AssertionError
  |– AttributeError
  |– BufferError
  |– EOFError
  |– ImportError
  |– LookupError
  |– MemoryError
  |– NameError
  |– OSError
  |– ReferenceError
  |– RuntimeError
  |– StopAsyncIteration
  |– StopIteration
  |– SyntaxError
  |– SystemError
  |– TypeError
  |– ValueError
  |– Warning

ここで、自身で例外を作成する場合の注意点ですが、直接の親とする例外は「Exception」かその配下にある例外の中から選択することが推奨されているようです。

直接「BaseException」の下に紐づけることは絶対にしないようにしましょう。

なお、階層が浅いものはその下にぶら下がっている例外も包含しています。

そのため、例えば「MemoryError」の例外が発生した場合の処理は、「MemoryError」でも「Exception」でも処理を設定できます。

第一階層の例外

exception BaseException

この例外は、他の例外の基底クラス(最上段の親となるクラス)として使われます。

また、ユーザーが任意で定義する例外の直接の親とすることはできません。

継承する場合は「Exception」を親とする必要があります。

第二階層の例外

exception SystemExit

この例外は sys.exit() 関数から発生し、インタープリタを終了させるものです。

ソースコード上でException配下の例外と誤認識されないように、BaseExceptionの直接の配下に位置しています。

なお、コンストラクタは sys.exit() に渡されるオプション引数と同じものを受け取ります。(以下、参照)

オプション引数システム終了ステータス(動作)
整数整数値がそのまま利用されます。
None0
それ以外の型1(オブジェクトの値が表示される)

codeについては、コンストラクタに渡された終了ステータス又はエラーメッセージとなります。デフォルトは「None」です。

exception KeyboardInterrupt

ユーザが割り込みキー (通常は Control-C または Delete) を押した場合に発生します。

ソースコードの実行中は、割り込みを定期的に監視されます。

ソースコード上でException配下の例外と誤認識されないように、BaseExceptionの直接の配下に位置しています。

exception GeneratorExit

ジェネレータ や コルーチン が閉じられたときに発生します。

この例外は厳密に言えばエラーではありません。

そのため、「Exception」の配下ではなく、BaseException配下に存在しています。

exception Exception

システム終了を除き、全ての組み込み例外が、このクラスから派生します。

ユーザーが任意で定義する例外も、このクラスから派生させることになります。

第三階層の例外

ArithmeticError

様々な計算処理を行う上で発生するエラーが発生した場合に発生する例外です。

「OverflowError」「ZeroDivisionError」「FloatingPointError」の基底クラスとなっています。

AssertionError

assert 文が失敗した場合に発生する例外です。

AttributeError

属性参照 (属性参照 を参照) や代入が失敗した場合に発生する例外です。

また、コンストラクタの引数を使用して、name および obj 属性を設定できます。

name および obj 属性が設定されている場合、アクセスが試行された属性の「名前」とその属性に対して「アクセスされたオブジェクト」をそれぞれ表します。

なお、オブジェクトが属性の参照や属性の代入をまったくサポートしていない場合には TypeErrorが送出されます。

BufferError

バッファに関わる操作が行えなかった場合に発生する例外です。

EOFError

input() が何もデータを読まずに end-of-file (EOF) に達した場合に発生する例外です。

ImportError

import文でモジュールをロードしようとして問題が発生する場合に発生する例外です。

「ModuleNotFoundError」の基底クラスでもあります。

from xxx import で、「xxx」が見つからない場合にも発生します。

また、コンストラクタの引数を使用して、name および path 属性を設定できます。

name および path 属性が設定された場合、「インポートを試みられたモジュールの名前」と「例外を引き起こしたファイルへのパス」をそれぞれ表します。

LookupError

マッピングまたはシーケンスで使われたキーやインデックスが無効な場合に発生する例外である「IndexError」「KeyError」の基底クラスです。

codecs.lookup() によって直接発生されることもあります。

MemoryError

メモリ不足が発生した状態で、復旧できる可能性がある場合に発生する例外です。

復旧方法は、メモリーを消費している要因を除去することです。例えば、起動しているオブジェクトの削除です。

機械学習やデータサイエンスの分野で使われるPythonですが、膨大なデータを扱っている場合に起きやすいと言えます。

NameError

ローカルまたはグローバルの名前が見つからなかった場合に発生する例外です。

ただし、これが適用されるのは、非修飾の名前のみに限られます。

また、コンストラクタの引数を使用して、name 属性を設定できます。

name 属性が設定されると、アクセスが試行された変数の名前を表します。

「UnboundLocalError」の基底クラスでもあります。

OSError

システム関数がシステム関連のエラーを返した場合に発生する例外です。

以下のどちらかの形式で構成されます。

  • OSError([arg])
  • OSError(errno, strerror[, filename[, winerror[, filename2]]])

なお、それぞれの引数(エラーが持つ属性)は以下を参考にしてください。

引数説明
errnoC変数errnoに由来する数値エラー番号です。
strerrorOSが提供するエラーメッセージです。
filenameファイルシステムパスが1つ関与する例外の場合に関数に渡されるファイル名です。
winerrorWindowsのネイティブエラー番号です。
整数で設定した場合は、「errno」は無視されて「errno」はwinerrorから決定されます。
Windowsではないプラットフォームでは無視されます。
filename2ファイルシステムパスが2つ関与する関数の場合に関数に渡される2つ目のファイル名です。

例えば、「FileNotFoundError」「InterruptedError」「ProcessLookupError」「TimeoutError」などがサブクラスに存在しています。

ReferenceError

ガーベジコレクションによって回収された後の参照対象オブジェクトの属性に、アクセスした場合に発生する例外です。

RuntimeError

他のカテゴリに分類できないエラーが検出された場合に発生する例外です。

「NotImplementedError」「RecursionError」の基底クラスでもあります。

StopAsyncIteration

イテレーションを停止するために、必要な例外です。

asynchronous iterator オブジェクトの __anext__() メソッドによって返されます。

StopIteration

「next()」と iterator の「__next__() 」によって、生成するアイテムがこれ以上ないことを伝えるために、発生する例外です。

generator や coroutine 関数が返るとき、新しい StopIteration インスタンスが送出されます。 関数の返り値は例外のコンストラクタの value 引数として使われます。

SyntaxError

パーサーが構文エラーに遭遇した場合に発生する例外です。

「importステートメント」「compile()」「exec()」「eval()」の呼び出し、「初期スクリプト」または「標準入力」を読み取る場合に、発生する可能性があります。

「IndentationError」の基底クラスでもあります。また、「IndentationError」には、「TabError」というサブクラスが存在します。

SystemError

インタプリタが内部エラーを検出しているが、回復の手段がないような状態ではないと見なされる場合に発生する例外です。

TypeError

適切でない型のオブジェクトに対して、関数や演算が適用された場合に発生する例外です。

ValueError

演算子や関数が、正しい型だが適切でない値を持つ引数を受け取ったときや、 IndexError のようなより詳細な例外では記述できない状況で送出されます。

「UnicodeError」の基底クラスでもあります。また、「UnicodeError」には、「UnicodeEncodeError」「UnicodeDecodeError」「UnicodeTranslateError」というサブクラスが存在します。

Warning

警告に関する例外の基底クラスになっています。

例えば、「UserWarning」「SyntaxWarning」「RuntimeWarning」「UnicodeWarning」「ResourceWarning」などがサブクラスとして存在しています。

まとめ

今回は、Pythonに存在する例外の一部について記載しました。

try-except文による例外処理などで利用する機会もあると思います。

ぜひ、参考にしてみて下さい。

スポンサーリンク