Pythonで例外を自作して使うコード例(3種類)

スポンサーリンク

Pythonで例外クラスを自作するコード例と、エラーメッセージを取得するコード例です。

Pythonの公式マニュアルによると、自作の例外は『ユーザー定義例外 (User-defined Exceptions) 』というようです。

例外クラスの書き方は決まりきっていたので、とても簡単でした。

  1. class と書いて、
  2. エラー名をつけて、
  3. カッコの中に Exception(エクセプション)

と書くだけです。

クラスの中身は無くてOKでしたので、pass と書きます。

# 例外クラスを作る
class XBRLParseError(Exception):
    """XBRLの解析中にエラーが発生したことを知らせる例外クラス"""
    pass

# 例外クラスを使う
raise XBRLParseError('あるはずのタグが見つかりませんでした')
(実行結果)
Traceback (most recent call last):
  File "main_except.py", line 7, in <module>
    raise XBRLParseError('あるはずのタグが見つかりませんでした')
__main__.XBRLParseError: あるはずのタグが見つかりませんでした

狙って例外を発生させるときは、自作の例外クラスを作って、それを raise文(レイズぶん)に渡すのがおすすめです。

例外クラスを print() 関数のようにして使うことで、オリジナルのエラーメッセージを載せた例外を発生させることができました。

もちろん、Python組み込みの ValueError() などにエラーメッセージを渡すこともできました。

しかしながら、例外クラスを自作したところ、ログやコンソールがとても見やすくなりました。

長く使うつもりのコードを書くときに、特におすすめです。

スポンサーリンク

自作の例外クラスを作るコード例

Pythonの公式マニュアルに、例外クラスの作り方が載っていました。

Python 公式マニュアル
エラーと例外 – ユーザー定義例外

エラー名でクラスを作って、組み込みの Exception(エクセプション)を継承するだけでOKでした。

あとは、適当なエラーメッセージを用意して、raise文と一緒に使うだけです。

ここでは、XBRLParseError という例外を作ってみました。

"""自作の例外クラスを作るコード例 (Python)"""

class XBRLParseError(Exception):
    """XBRLの解析中にエラーが発生したことを知らせる例外クラス"""
    pass


def main():
    """自作した例外クラスを使う関数"""

    tag = '(タグ名)'

    raise XBRLParseError('対応するタグが見つかりません %s' % tag)

    return


if __name__ == '__main__':
    main()

実行結果

エラーメッセージが出て、raise文(レイズぶん)のところで止まりました。

try文を使わなかったので、これが正常な動作になります。

Traceback (most recent call last):
  File "main_except_1.py", line 19, in <module>
    main()
  File "main_except_1.py", line 13, in main
    raise XBRLParseError('対応するタグが見つかりません %s' % tag)
__main__.XBRLParseError: 対応するタグが見つかりません (タグ名)

簡単な例外クラスで十分に役立った

ほんの3行の例外クラスでしたが、自作の例外を使ったことで、プログラムのログがとても見やすくなりました

なお、自作の例外クラスには、ほかにもいろいろな機能が追加できるようでした。

しかしながら、個人的にはそこまで色々必要になったケースはなかったです。

Pythonの公式マニュアルにも『通常は単純なものに (usually kept simple)』とありましたし、実際にそれで十分役に立っています。

ログファイルをチェックしているときに、これは自分が意図的に起こしたエラーだと、ひと目でわかるようになりました。

スポンサーリンク

エラーメッセージ、例外の名前、例外の説明を取得するコード例

try文で例外をキャッチした時に、エラー情報の要点だけを取り出すコード例です。

エラーメッセージだけを取得したり、例外の名前(エラーの名前、例外クラスの名前)だけを取得することができます。

except節(エクセプトせつ)に XBRLParseError as e と書けば、例外クラスのインスタンスが入った変数 e から、個々の情報が取り出せます。

"""エラーメッセージ、例外の名前、例外の説明を取得するコード例 (Python)"""

class XBRLParseError(Exception):
    """XBRLの解析中にエラーが発生したことを知らせる例外クラス"""
    pass


def main():
    """自作した例外クラスを使う関数"""

    print('■ エラーメッセージを添えて例外を発生させるコード例')

    arc_to = '(to属性の名前)'
    try:
        raise XBRLParseError('to属性に対応するタグが見つかりません %s' % arc_to)
    except XBRLParseError as e:
        print(e)
        print(e.args)
        print(e.__class__)
        print(e.__class__.__name__)
        print(e.__doc__)


    print('\n■ e.args の中には、例外クラスに渡した変数が入ります。')

    src_number = 2
    src_files = ['a.csv', 'b.csv', 'c.csv']
    try:
        raise XBRLParseError('パースできませんでした', src_number, src_files)
    except XBRLParseError as e:
        print('     e: %s' % e)
        print('e.args: %s' % str(e.args))
        for (n, arg) in enumerate(e.args):
            print('args[%d]: %s' % (n, arg))
    return


if __name__ == '__main__':
    main()

実行結果

以下のようになりました。

エラーメッセージエラー名(例外クラス名)だけを取り出すことができました。

そのほか、自作の例外クラスの説明文を取り出すこともできました。

もし、変数 e から文字列だけを取り出したいときは、str()関数を使って、text = str(e) のようにします。

また、エラーメッセージと一緒に、各種変数を受け取ることもできました。

例外クラスが受け取った複数の変数は、タプル (tuple) として e.args に入りました。

以下が実行結果です。

■ エラーメッセージを添えて例外を発生させるコード例
to属性に対応するタグが見つかりません (to属性の名前)
('to属性に対応するタグが見つかりません (to属性の名前)',)
<class '__main__.XBRLParseError'>
XBRLParseError
XBRLの解析中にエラーが発生したことを知らせる例外クラス

■ e.args の中には、例外クラスに渡した変数が入ります。
     e: ('パースできませんでした', 2, ['a.csv', 'b.csv', 'c.csv'])
e.args: ('パースできませんでした', 2, ['a.csv', 'b.csv', 'c.csv'])
args[0]: パースできませんでした
args[1]: 2
args[2]: ['a.csv', 'b.csv', 'c.csv']

エラーをログに出力するコード例

エラーメッセージはログファイルに記録しておくのが便利です。

Python のロギングモジュールでロガーを作って、自作の例外を記録するコード例を紹介します。

ロガーの作り方は、Python の公式マニュアルに載っていました。

Python 公式マニュアル
Logging HOWTO – 上級ロギングチュートリアル – ロギングの環境設定

以下のコードでは、コンソール表示とログファイルに、同じ内容を出力します。

"""エラーをログに出力するコード例 (Python)"""
import logging

class XBRLParseError(Exception):
    """XBRLの解析中にエラーが発生したことを知らせる例外クラス"""
    pass


def get_logger(file):
    """ロガーを作る関数"""
    # (1/3) ロガーを取得 & ロギングレベル設定
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)

    # (2/3) ストリームハンドラを取得 & ロギングレベル設定 & ロガーに追加
    s = logging.StreamHandler()
    s.setLevel(logging.DEBUG)
    logger.addHandler(s)

    # (3/3) ファイルハンドラを取得 & ロギングレベル設定 & ロガーに追加
    f = logging.FileHandler(file, mode='a', encoding='utf-8')
    f.setLevel(logging.DEBUG)
    logger.addHandler(f)
    return logger


def main():
    """自作した例外クラスを使う関数"""

    # (1/4) ログファイルを指定して、ロガーを取得します。
    log_file = r'(ログフォルダを指定します)\log.txt'
    lg = get_logger(file=log_file)

    # (2/4) 例外を発生させます
    tag = '(タグ名)'
    try:
        raise XBRLParseError('対応するタグが見つかりません %s' % tag)
    except XBRLParseError as e:
        # (3/4) ロガーでエラーの表示とファイル出力を行います
        lg.debug(e)
        lg.debug(e.args)
        lg.debug(e.__class__)
        lg.debug(e.__class__.__name__)

    # (4/4) ロギングシステムをシャットダウンします
    logging.shutdown()
    return


if __name__ == '__main__':
    main()

実行結果

コンソール表示とログファイルに、同じ内容が出力されました。

コンソール表示

対応するタグが見つかりません (タグ名)
('対応するタグが見つかりません (タグ名)',)
<class '__main__.XBRLParseError'>
XBRLParseError

ログファイル

対応するタグが見つかりません (タグ名)
('対応するタグが見つかりません (タグ名)',)
<class '__main__.XBRLParseError'>
XBRLParseError

自作の例外クラスは非常に有用でした

自作の例外クラスを作ったことで、例外に名前を付けたり、print() 関数のようにしてエラーメッセージを載せたりすることができるようになりました。

コンソール表示やログファイルがとても見やすくなったので、とてもおすすめです。

タイトルとURLをコピーしました