SIGMA-SE Tech Blog

SIGMA-SE Tech Blog

Python - 例外 : 例外処理と組込み例外クラス

目的

この記事では、Pythonの例外処理と組込み例外クラスそれぞれの概要について記載する。

解説と実装サンプル

例外処理と例外クラス

文字通り、例外(正常系でない想定外のエラー)が発生した場合に対処する処理を例外処理と呼び、Pythonでは、メイン処理をtry句に、例外処理をexcept句に記載する。

また、except句に指定する例外クラスによって、どの例外をキャッチするか指定することができる。

  • 例外クラス BaseException を指定した場合の構文例
    $ python
    >>> try:
    ...     # メイン処理を記載…
    >>> except BaseException:
    ...     # BaseExceptionクラスでキャッチした場合の例外処理を記載…
    >>>
    

ただし、BaseExceptionは、Pythonすべての組込み例外クラスの派生元(基底)となっており、すべての例外キャッチしてしまうため(ユーザーの妨げになる場合もあるため)、Exceptionクラス等のキャッチしたい目的に応じた例外クラスを指定する。

組込み例外クラス一覧

以下、Pythonの組込み 例外クラスとそれぞれの概要。
すべて前項で記載した BaseExceptionから派生する。

例外クラス名 例外キャッチ(except)タイミング
BaseException 任意の組込み例外が発生した場合。(全組込み例外の基底クラス)
┣ SystemExit システム終了した場合。(sys.exit()、exit等)
┣ KeyboardInterrupt ユーザーのキー割込み(Ctrl+C等)が発生した場合。
┣ GeneratorExit ジェネレータ 、コルーチンを閉じた場合。(generator.close() 、coroutine.close())
┗ Exception システム終了以外の例外が発生した場合。(ユーザー定義の例外はここから派生させる。)
 ┣ StopIteration イテレータによる次の領域参照時(next()、イテレータの__next__())、対象が存在しない場合。
 ┣ StopAsyncIteration 非同期イテレータによる次の領域参照時(非同期イテレータの__anext__())、対象が存在しない場合。
 ┣ ArithmeticError 算術演算で例外が発生した場合。(OverflowError, ZeroDivisionError, FloatingPointError の基底クラス。)
 ┃┣ FloatingPointError 浮動小数点の演算で失敗した場合。※ 3.7以降のバージョンでは使われていないので注意。(*1)
 ┃┣ OverflowError 算術演算結果が表現できない値になった場合。
 ┃┗ ZeroDivisionError 除算や剰余演算でゼロ割り演算された場合。
 ┣ AssertionError assertが失敗した場合。
 ┣ AttributeError 属性参照や代入が失敗した場合。(対象となるオブジェクトが属性参照や代入自体をサポートしていない場合は、TypeErrorとなる。)
 ┣ BufferError バッファ関連の操作に失敗した場合。
 ┣ EOFError input()がデータを読み込んでいない状態でend-of-file (EOF)に達した場合。(io.IOBase.read(), io.IOBase.readline()は、EOF に達すると空文字列を返す。)
 ┣ ImportError importによるロードが失敗した場合。
 ┃┗ ModuleNotFoundError importによるロード時、モジュールが見つからない場合 または sys.modules に None が含まれる場合。
 ┣ LookupError マッピング または シーケンスで使われるキーやインデクスが無効な場合(IndexError, KeyError の基底クラス。)
 ┃┣ IndexError シーケンスのインデックスが範囲外の場合。(インデックスが整数でない場合は、TypeErrorとなる。)
 ┃┗ KeyError マッピングキー(連想配列キー)が見つからなかった場合。
 ┣ MemoryError メモリ不足が発生した場合。
 ┣ NameError 存在しないオブジェクト名が指定されている場合。(UnboundLocalError の基底クラス。)
 ┃┗ UnboundLocalError 値が代入されていないローカル変数を参照した場合。
 ┣ OSError システム関数でエラーが発生した場合。(BlockingIOError ~ TimeoutError の基底クラス。)
 ┃┣ BlockingIOError ノンブロッキング処理にて処理対象のオブジェクトが事前処理等の準備が整う前に指示がされた場合。(errno EAGAIN, EALREADY, EWOULDBLOCK, EINPROGRESS)
 ┃┣ ChildProcessError 子プロセスの操作に失敗した場合。(errorno ECHILD)
 ┃┣ ConnectionError コネクション関連の操作に失敗した場合。(BrokenPipeError~ ConnectionResetErrorの基底クラス。)
 ┃┃┣ BrokenPipeError 操作ができないコネクションのパイプ または ソケットを操作した場合。(errno EPIPE, ESHUTDOWN)
 ┃┃┣ ConnectionAbortedError 通信先の接続が中断された場合。(errno ECONNABORTED)
 ┃┃┣ ConnectionRefusedError 通信先の接続が拒否された場合。(errno ECONNREFUSED)
 ┃┃┗ ConnectionResetError 通信先の接続がリセットされた場合。(errno ECONNRESET)
 ┃┣ FileExistsError すでに存在するファイル または ディレクトリを作成しようとした場合。(errno EEXIST)
 ┃┣ FileNotFoundError 操作対象のファイル または ディレクトリが存在しない場合。(errno ENOENT)
 ┃┣ InterruptedError システムコールが中断された場合。(errno EINTR)
 ┃┣ IsADirectoryError ディレクトリにファイル操作(os.remove() 等)が要求された場合(errno EISDIR)
 ┃┣ NotADirectoryError ディレクトリ以外にディレクトリ操作(os.listdir() 等)が要求された場合。(errno ENOTDIR)
 ┃┣ PermissionError アクセス権がないユーザーで操作を行った場合。(errno EACCES, EPERM)
 ┃┣ ProcessLookupError プロセスが存在しない場合。(errno ESRCH)
 ┃┗ TimeoutError システム関数がシステムレベルでタイムアウトした場合。(errno ETIMEDOUT)
 ┣ ReferenceError 弱参照プロキシ(weakref.proxy()で生成)を使って、ガーベジコレクションにより回収した後の対象オブジェクトにアクセスした場合。
 ┣ RuntimeError 他に分類できないエラーが検出された場合。(NotImplementedError, RecursionErrorの基底クラス。)
 ┃┣ NotImplementedError ユーザ定義の基底クラスにおいて、抽象メソッドが派生クラスでオーバライドされていない場合。(または クラスの一部が未実装である場合 等)
 ┃┗ RecursionError 最大再帰回数(sys.getrecursionlimit())を超えた場合。
 ┣ SyntaxError 構文エラーが発生した場合。(IndentationErrorの基底クラス。)
 ┃┗ IndentationError インデントに関する構文エラーが発生した場合。(TabErrorの基底クラス。)
 ┃  ┗ TabError インデントで使用するタブとスペースに一貫性がない場合。
 ┣ SystemError システムエラー(インタプリタが検知した内部エラー)が発生した場合。
 ┣ TypeError 型が不整合である場合。
 ┣ ValueError 型は適切だが設定元(代入や引数等)の値が適切でない場合。(UnicodeErrorの基底クラス。)
 ┃┗ UnicodeError Unicodeのエンコード または デコードエラーが発生した場合。(UnicodeDecodeError, UnicodeEncodeError, UnicodeTranslateErrorの基底クラス。)
 ┃  ┣ UnicodeDecodeError Unicodeに関するエラーがデコード中に発生した場合。
 ┃  ┣ UnicodeEncodeError Unicodeに関するエラーがエンコード中に発生した場合。
 ┃  ┗ UnicodeTranslateError Unicodeに関するエラーが変換中に発生した場合。
 ┣ Warning 下記サブクラスの警告が発生した場合。(DeprecationWarning ~ ResourceWarningの基底クラス。)
 ┣ DeprecationWarning 廃止された機能に対する警告が発生した場合。
 ┣ PendingDeprecationWarning 将来廃止される予定である機能に対する警告が発生した場合。
 ┣ RuntimeWarning 曖昧なランタイム挙動に対する警告が発生した場合。
 ┣ SyntaxWarning 曖昧な構文に対する警告が発生した場合。
 ┣ UserWarning ユーザコードによって生成される警告が発生した場合。
 ┣ FutureWarning 構文内に今後(次期バージョン等で)、意味やその構成が変わる予定があるものが含まれる場合。
 ┣ ImportWarning モジュールインポートの誤りが疑われる警告が発生した場合。
 ┣ UnicodeWarning Unicode関連の警告が発生した場合。
 ┣ BytesWarning bytes や bytearray に関連した警告が発生した場合。
 ┗ ResourceWarning リソースの使用に関連した警告が発生した場合。

※ 各項目の詳細は下記マニュアルを参照。 https://docs.python.org/ja/3.6/library/exceptions.html

組込み例外クラスのツリー表示サンプル

以下、前項の組込み例外クラス一覧をツリー表示した実装サンプル。
classtree関数にBaseExceptionを渡し、再帰的にBaseExceptionを出力している。

※ 参考元:Pythonの組み込み例外の木構造を見てみる

  • ツリー表示サンプル

    $ python
    >>> def classtree(cls, depth=0):
    ...     if depth == 0:
    ...         prefix = ''
    ...     else:
    ...         prefix = '.' * (depth * 3) + ' '
    ...     if cls.__name__.lower() == 'error':
    ...         print('{0}{1} ({2})'.format(prefix, cls.__name__, cls))
    ...     else:
    ...         print('{0}{1}'.format(prefix, cls.__name__))
    ...     for subcls in sorted(cls.__subclasses__(), key=lambda c: c.__name__):
    ...         classtree(subcls, depth+1)
    ...
    >>> if __name__ == '__main__':
    ...     print('Python Version: {0}'.format(platform.python_version()))
    ...     print()
    ...     classtree(BaseException)
    ...
    
  • 上記の実行結果

    Python Version: 3.6.4
    
    BaseException
    ... Exception
    ...... ArithmeticError
    ......... FloatingPointError
    ......... OverflowError
    ......... ZeroDivisionError
    ...... AssertionError
    ...... AttributeError
    ...... BufferError
    ...... EOFError
    ...... Error (<class 'locale.Error'>)
    ...... ImportError
    ......... ModuleNotFoundError
    ......... ZipImportError
    ...... LookupError
    ......... CodecRegistryError
    ......... IndexError
    ......... KeyError
    ...... MemoryError
    ...... NameError
    ......... UnboundLocalError
    ...... OSError
    ......... BlockingIOError
    ......... ChildProcessError
    ......... ConnectionError
    ............ BrokenPipeError
    ............ ConnectionAbortedError
    ............ ConnectionRefusedError
    ............ ConnectionResetError
    ......... FileExistsError
    ......... FileNotFoundError
    ......... InterruptedError
    ......... IsADirectoryError
    ......... ItimerError
    ......... NotADirectoryError
    ......... PermissionError
    ......... ProcessLookupError
    ......... TimeoutError
    ......... UnsupportedOperation
    ...... ReferenceError
    ...... RuntimeError
    ......... BrokenBarrierError
    ......... NotImplementedError
    ......... RecursionError
    ......... _DeadlockError
    ...... StopAsyncIteration
    ...... StopIteration
    ...... StopTokenizing
    ...... SubprocessError
    ......... CalledProcessError
    ......... TimeoutExpired
    ...... SyntaxError
    ......... IndentationError
    ............ TabError
    ...... SystemError
    ......... CodecRegistryError
    ...... TokenError
    ...... TypeError
    ...... ValueError
    ......... UnicodeError
    ............ UnicodeDecodeError
    ............ UnicodeEncodeError
    ............ UnicodeTranslateError
    ......... UnsupportedOperation
    ...... Verbose
    ...... Warning
    ......... BytesWarning
    ......... DeprecationWarning
    ......... FutureWarning
    ......... ImportWarning
    ......... PendingDeprecationWarning
    ......... ResourceWarning
    ......... RuntimeWarning
    ......... SyntaxWarning
    ......... UnicodeWarning
    ......... UserWarning
    ...... _OptionError
    ...... error (<class 'sre_constants.error'>)
    ... GeneratorExit
    ... KeyboardInterrupt
    ... SystemExit
    

※ エラー:sre_constants.errorは、正規表現が曖昧な場合に発生するようだが深くは触れない。
詳しくは、下記を参考。
what is sre_constants.error: nothing to repeat

また、help(__builtins__)からも例外クラスを確認できる。

$ python
>>> help(__builtins__)

Help on built-in module builtins:

NAME
    builtins - Built-in functions, exceptions, and other objects.

DESCRIPTION
    Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.

CLASSES
    object
        BaseException
            Exception
                ArithmeticError
                    FloatingPointError
                    OverflowError
                    ZeroDivisionError
                AssertionError
                AttributeError
                BufferError
                EOFError
                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
                    RecursionError
                StopAsyncIteration
                StopIteration
                SyntaxError
                    IndentationError
                        TabError
                SystemError
                TypeError
                ValueError
                    UnicodeError
                        UnicodeDecodeError
                        UnicodeEncodeError
                        UnicodeTranslateError
                Warning
                    BytesWarning
                    DeprecationWarning
                    FutureWarning
                    ImportWarning
                    PendingDeprecationWarning
                    ResourceWarning
                    RuntimeWarning
                    SyntaxWarning
                    UnicodeWarning
                    UserWarning
            GeneratorExit
            KeyboardInterrupt
            SystemExit
            …(以降省略)

参考文献

金城 俊哉 (2018) 『現場ですぐに使える! Pythonプログラミング逆引き大全313の極意』株式会社昭和システム



Copyright SIGMA-SE All Rights Reserved.
s-hama@sigma-se.jp