Try T.M Engineer Blog

多摩市で生息するエンジニアが「アウトプットする事は大事だ」と思って始めたブログ

Pythonチュートリアルを読んで学んだ事(例外処理)

はじめに

最近、カックさんのブログで「「Python 3 エンジニア認定基礎試験」に合格した」という記事が話題になっていて、Python 3を仕事で使っている身としては、非常に興味深かった。

kakakakakku.hatenablog.com

そもそもPython 3の認定試験なるものが存在する事をこの記事を読んで、はじめて知りました。Pythonを学ぶにあたっての1つの目標になりそうですね。
さて、そのPython 3の認定試験(Python 3 エンジニア認定基礎試験)ですが、以下オライリー本「Pythonチュートリアル第3版」から出題されるとのこと。

Pythonチュートリアル 第3版

Pythonチュートリアル 第3版

しかし、この本、なんとウェブ上で無料公開されているとの事で、大変驚きました。 Pythonについて学習したい方は、一度見てみる事をオススメします。(Pythonのバージョン毎に内容が異なってくるので、注意してください)

docs.python.jp

というわけで、私もさっそく復習を兼ねて読んでみました。

意外と知らないことが多かった例外処理

改めて読んでみると、意外にも知らない(すでに忘れていた)事が多々あり、勉強になった。その中でも例外処理の独自例外について、個人的に興味深かったので纏めておく。

Pythonでは、例外を独自で作る(独自例外という)ことができる。以下の様に事前に例外用のclassを宣言しておけば作成可能だ。

class MyError(Exception):
    pass

try:
    raise MyError
except MyError:
    print("[ERROR] MyError")

>
>[ERROR] MyError

classなので、初期化用の関数(__init__())を宣言することができる。 exceptした後の処理は、初期化用の関数が動いた後に動く。
また、独自例外は引数を使った値の受け渡しも可能だ。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)

try:
    raise MyError(400, 'not found')
except MyError:
    print("[ERROR] MyError")

>
>初期処理: 400 not found
>[ERROR] MyError

例外処理は、__str__()関数に定義されている。__str__()関数に処理を書くと、確かに実行された。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)
        self.code = code
        self.message = message

    def __str__(self):
        print('[Error] MyError CODE=', self.code)
        print('[Error] MyError MSG=', self.message)

raise MyError(400, 'not found')

>
>初期処理: 400 not found
>Traceback (most recent call last):
  >File "<stdin>", line 1, in <module>
>[Error] MyError CODE= 400
>[Error] MyError MSG= not found
>__main__.MyError: <exception str() failed>

上記では、try: except:しなかった。というのも、どうやら優先順位があるようで、__str__()関数の処理よりもexceptが優先される模様。恐らく、__str__()関数は、例外を発生させる関数という位置付けなので、exceptを使って例外をハンドリングさせている場合は、「動かない」という事だろう。

class MyError(Exception):
    def __init__(self, code, message):
        print('初期処理:',code, message)
        self.code = code
        self.message = message

    def __str__(self):
        print('[Error] MyError CODE=', self.code)
        print('[Error] MyError MSG=', self.message)

try:
    raise MyError(400, 'not found')
except MyError:
    print("[ERROR] MyError")

>
>初期処理: 400 not found
>[ERROR] MyError

まとめ

  • Pythonでは、classを事前に用意することで、独自例外を作ることができる。
  • 独自例外では、初期化用の関数__init__()と、例外を発生させる関数__str__()を宣言できる。
  • __init__()raiseされた瞬間に呼び出される。__str__()exceptされていなければ呼び出される。(逆にexceptされていると呼び出されない)