pythonでスマートに例外処理をする

現状と問題点

関数内での処理中に何か不都合があって、処理が正常に終わらなかった場合、なんかFalseとかエラーメッセージとかを返したい。
でも正常に終わった場合は辞書オブジェクトとか返したい。
呼び出し側で

def testFunction():
    if hogehoge == True:
        return({1:data,2:data,3:data...})
    else:
        return(False)
def main()
    result = testFunction()
    if result == False:
        # 例外処理

とかやると、結果がFalseじゃなかった場合に辞書オブジェクトはBooleanじゃねーよばーかとか怒られるし。空配列返して「配列が空だったら例外処理」っていうのも、いろいろの兼ね合いで都合が悪かったり、スマートじゃないし。みたいな時は、

return({"result":True,"body":"data"...})

とか頑張っていたんですけど、それでも呼び出し側にif文がごりごり増えるし。戻り値がややこしやーになるし。
と、そんな時に、スマートな例外処理を教えてもらったので。

改善したコード

class TestException(Exception):
   def __init__(self, message, hoge):
       self.message = message
       self.hoge = hoge
   def __str__(self):
       return repr(self.message)

上記のように、python組み込みのExceptionクラスを継承したオリジナル例外クラスを用意。(組み込みクラスで対応できる例外ならそれでも十分。ステータスコードだとかの特殊な情報が例外処理に必要な場合はオリジナルクラスを作ると吉)

例外が発生したら、

raise(TestException("Reigai_ga_hassei_shita_Yo!","other_infomation"))

こうやって例外を投げて、受け取る側で

try:
    # ~hogehoge~
exception TestExeption as e:
    str(e) # 例外クラス内の__str__メソッドでreturnされる文字列だけを表示できる
    e.hoge # 例外オブジェクト内の変数hogeにアクセスできる
exception Exeption as e:
    # さらに予期せぬ例外はここでcatchされる

こうやれば、正常系の処理はtry節内で、例外の処理はexception節内で処理できる。いちいち処理が成功したかの判定を戻り値に含める必要がない。

この記事が気に入ったらサポートをしてみませんか?