はじめに
最近、カックさんのブログで「「Python 3 エンジニア認定基礎試験」に合格した」という記事が話題になっていて、Python 3を仕事で使っている身としては、非常に興味深かった。
そもそもPython 3の認定試験なるものが存在する事をこの記事を読んで、はじめて知りました。Pythonを学ぶにあたっての1つの目標になりそうですね。
さて、そのPython 3の認定試験(Python 3 エンジニア認定基礎試験)ですが、以下オライリー本「Pythonチュートリアル第3版」から出題されるとのこと。
- 作者: Guido van Rossum,鴨澤眞夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2016/03/24
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
しかし、この本、なんとウェブ上で無料公開されているとの事で、大変驚きました。 Pythonについて学習したい方は、一度見てみる事をオススメします。(Pythonのバージョン毎に内容が異なってくるので、注意してください)
というわけで、私もさっそく復習を兼ねて読んでみました。
意外と知らないことが多かった例外処理
改めて読んでみると、意外にも知らない(すでに忘れていた)事が多々あり、勉強になった。その中でも例外処理の独自例外について、個人的に興味深かったので纏めておく。
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
されていると呼び出されない)