Python 例外と例外処理 #3

株式会社リュディアです。引き続き例外と例外処理についてまとめていきたいと思います。

前回までの Python の例外と例外処理についてのまとめへのリンクは以下を参考にしてください。

今回はどのような場合に例外を使うのか?というなかなか難しいテーマについて扱いたいと思います。プロジェクトや組織単位で方針が決まっていることもあるでしょうし、ここに書いてることはあくまで私の好みです。

私が Python の参考書として見ていた以下の部分は非常に考えさせられるものでした。

上記で使われている内容をそのまま使わせてもらいます。まずありがちな悪い見本として例示されているものです。

def get_status(file):
   if not os.path.exists(file):
       print "file not found"
       sys.exit(1)
   return open(file).readline()

これは os.path.exists(file) でファイルが存在するかどうかを確認し存在しなければ sys.exit(1) で終了するというものです。このコードの問題点として以下の 2 つがあげられています。

1. os.path.exists()を呼んでから open() を呼ぶまでの間にファイルが消された場合
2. ファイルは存在するが読み出し権限が無い場合

この例の前に以下のような文も記載されています。

例外は Python の有用な機能です。何か期待している以外のことが起これば例外を出す、という習慣を持つべきですが、それと同時に、何か対処できるときにだけ捕捉する、ということも習慣にしてください。

これも非常に重要な考え方だと思います。ここまで例外と例外処理についてまとめてきましたが、私は例外処理を以下の 2 箇所以外では使っていません。さらに発生するすべての例外に対応するのではなく狭い範囲の例外にのみ対応をしています。

1. ファイル操作に関する部分
2. ユーザーが何らかの入力を行い、その入力を処理する部分

この 2 箇所の共通点は自分の書いたプログラム内部で処理しきれないということです。1 のファイルに関しては OS やネットワークのトラブルで偶然に見えない状態が発生するなど外部要因があります。また 2 のユーザーからの入力についてもユーザーが何を入力してくるか、すべてに対応するプログラムを準備するのは大変です。そこでこれら2つの場合だけ例外を使っています。

私自身が例外と例外処理が複雑に入り組んだコードを読み解くことが苦手であることもあります。特に Python では可読性が最重要と思いながらコーディングしているので他の人が読みやすいコードを記載する際に例外処理の記述は避けた方がよいという気持ちもあります。

今回は 3回に渡って例外と例外処理についてまとめてきましたが、私自身があまり使わないという結論で終わりたいと思います。もちろんプログラムの用途によっては例外は避けて通れなかったり、プロジェクトや組織で例外の使い方が決まっている場合もありますので、その場合は従うべきです。また例外を使うことでエレガントなプログラムを記述する方も多数おられるのですが、残念ながら私にはその能力はないということでご容赦ください。

では、ごきげんよう。


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