paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

python exceptの超簡単なエラーハンドリングあれこれ

pythonで例外処理をするとき

try:
  <code>
except:
  <code>

を使いますよね。
私が勉強した本にもこう書いてあって例外ケースを飛ばして進めたいときは使っています。

また、チュートリアル的なサイトでは

except XXXError as e:
  print(e)

みたいな文がよく出てきてこれなんだろうと思っていたんですが
この書き方を使う時があったのでメモしておきます。

エラーの種類を分類して処理するときに使うものなんですね。

pythonのエラー文

pythonに限らずですが、構文がミスってたりするとエラーが出ますよね。

試しに適当に打ってみると、

>>> x = x + 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> with open('test.txt', 'r') as f:
...   a = f.read()
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'
>>>
>>> 1 / 0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero

と上記の例で

  • NameError
  • FileNotFoundError
  • ZeroDivisionError

と3種類のエラーメッセージが出ました。

exceptの後にこのエラーの種類を書くことで特定のエラーのみをハンドリングする、ということだったんですね。

try文で試し

先ほどのエラー例をtryを使って書いてみます。

  • 指定なし
>>> try:
...   x = x + 1
... except:
...   print('Error')
...
Error

エラーなのでexceptの処理をしていますが、とりあえず"Error"を出力するだけなので詳細がわかりませんね。
また、マニュアルにはexceptだけだとワイルドカード扱いで全てのエラーを隠してしまうので注意せよと書いてありました。

  • NameError(想定のエラー)
>>> try:
...   x = x + 1
... except NameError as e:
...   print(e)
...
name 'x' is not defined

そのままですが、変数未定義を想定したエラーメッセージが出てますね。

  • FileNotFoundError(想定外のエラー)
>>> try:
...   x = x + 1
... except FileNotFoundError as e:
...   print(e)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'x' is not defined

変数未定義に対しFileNotFoundの処理しか書いていなかったのでスタックトレースも出てます。(別に問題なさそうだけど)

  • Exception

ちなみにこちらを書いておくとエラーの種類を問わず出力してくれます。

>>> try:
...   x = x + 1
... except Exception as e:
...   print(e)
...
name 'x' is not defined


>>> try:
...   with open('test.txt', 'r') as f:
...      a = f.read()
... except Exception as e:
...   print(e)
...
[Errno 2] No such file or directory: 'test.txt'

変数未定義、ファイルが存在しない、とどちらも出力できてますね。

まとめ

自分が作るツールは自分で使うものかつ小規模なものなのであまりエラーハンドリングをする必要がなく、機会が無かったのですが今回少し整理できました。

とはいえどう使うのがいいのかまではイマイチわかっていません。
入力させる処理とセットで入力ミスの戻しとかに使うんでしょうか。
はたまたシステム的なエラーを見つけるためでしょうか。

私が今回発見したのは設計時のExcelのインプット資料をpythonでテキストファイルに落とす時でした。
社外秘の資料なのでコードもお見せすることはできないのですが、新発見だったので本エントリに残しておきます。

初歩的な処理になりますが、まだまだ使えてない機能がありますね。

また、タイトルにあれこれと書きましたが、例外の種類がめちゃくちゃあるのでほんの一部だけです…

参考サイト

8. エラーと例外 — Python 3.8.5 ドキュメント