「エラー処理をしなければなりません」という誤った強迫観念

やるな、つー話ではないのよ。

見飽きてるけどさ、「製品」であれ OSS であれ、こういうトンチキなコードは日常茶飯事なわけよね:

 1 def sub():
 2     try:
 3         return somefun()
 4     except some.honyarara.exceptions.SystemError as e:
 5         logger.error("エラーが発生しました、世界の破滅です!!!!")
 6         return None
 7     except some.honyarara.exceptions.ValueError as e:
 8         logger.error("エラーが発生しました、世界の破滅というほどではありません")
 9         return None
10 
11 def main():
12     res = sub()
13     if not res:
14         logger.error(
15             "エラーが発生したと思われる戻り値が返ってきたようです、世界の破滅する可能性が起こっていることが否定できません。")

python なので return None が意味がないとかそういうことはまぁどうでも良くて、言いたいことは「何をすればいいのか判然としない場所で何かをしなければならないと思い込んでいるのはなぜなんだよ」というただ一点である。

エラー処理の原則は本当はめっちゃ簡単なんだけれど、なんでこういうのがちゃんと出来ないのか、教えられないのか、と思うんだよねぇ。原則はもう既に言ってる。「何をすればいいのかはっきりしている場所で適切なことをする」ただこれだけである。ので、たとえば上の例では少なくともこうでないといけないわけである:

 1 def sub():
 2     return somefun()
 3 
 4 def main():
 5     try:
 6         res = sub()
 7     except some.honyarara.exceptions.SystemError as e:
 8         logger.error("エラーが発生しました、世界の破滅です!!!!")
 9     except some.honyarara.exceptions.ValueError as e:
10         logger.error("エラーが発生しました、世界の破滅というほどではありません")

もっと従いやすい指針の形で言うとするならば、「エラー時に何をすべきかわかる箇所とは、一般にはコントローラ部分に集中し、また、システム・サブシステムの境界部分もほとんどの場合はそれをすべき場所である」という話。そしてそれ以外の個所では「エラーはただ呼び出し元に伝搬させることだけに専念する」。これだけ。

java の checked/unchecked の区分、そして IDE がそれに従って「処理せねばならんよ」と脅すことで try catch をありとあらゆる箇所にまき散らすエンジニアが増殖した側面はあるにはある。けれども、IDE が「なんかしろよ」と促したとて java なら「throws に並べるだけ」という選択を取ることが出来るわけで、そこでなぜに「その場で catch してその場で何かしらする」ことだけを正義と信じるエンジニアが多いのかは、ほんとに理解に苦しむんだよねぇ。だってさぁ、「なんで何すればいいのかわからないのに何かしようとするの?」てことだよな??

なんてことを毎日思いながら仕事している今日この頃。