Pythonにおける例外処理のベストプラクティス!適切なエラーメッセージで問題解決

当サイトでは一部リンクに広告が含まれています
アイキャッチ

Pythonを使って何かを作りたいとき、コードを書いていると思わぬエラーに遭遇することがありますよね。
そんな時、どう対処したら良いのでしょうか。

そこで今回は、Pythonでエラーにどう対処するか、具体的に解説していきます。

目次

例外処理とは何か

プログラムを書いているとエラーに遭遇することはよくあります。
その際、適切にエラーを捉えて対処することが求められます。
このエラーの対処方法を「例外処理」と言います。

例外処理を使うと、エラーが起きた時でもプログラムを止めずに適切な処理を行うことができます。
これにより、使う人がストレスなくプログラムを使えるようになります。

例:

try:
  f = open('nonexistent_file.txt')
except FileNotFoundError:
  print('指定したファイルが存在しません。')

このような例外処理を使うことで、存在しないファイルを開こうとしたときにエラーを捉えて、エラーメッセージを出すことができます。

Pythonでよく出る例外

Pythonには、さまざまな例外が存在します。
以下に、よく遭遇する例外について説明します。

Exception

すべての例外の基本となるものです。
具体的な問題を知りたい場合、この例外ではなく、もっと具体的な例外を捉える必要があります。

try:
  f = open('nonexistent_file.txt')
except Exception:
  print('エラーが発生しました。')

この例では、存在しないファイルを開こうとしたときにExceptionが発生します。
それを捉えて、「エラーが発生しました。」というメッセージを出します。

しかし、このメッセージでは、何が問題だったのかわかりません。
そのため、この例外を使うことは避けるべきです。

ValueError

関数に数値を渡すべきところに、文字列を渡してしまったときなどに出ます。

try:
  int('a')
except ValueError:
  print('数値に変換できません。')

この例では、文字列を数値に変換しようとしたときにValueErrorが発生します。
それを捉えて、「数値に変換できません。」というメッセージを出します。

ZeroDivisionError

0で割ろうとしたときに出ます。

try:
  1 / 0
except ZeroDivisionError:
  print('0で割ることはできません。')

この例では、1を0で割ろうとしたときにZeroDivisionErrorが発生します。
それを捉えて、「0で割ることはできません。」というメッセージを出します。

TypeError

関数に数値を渡すべきところに、リストを渡してしまったときなどに出ます。

try:
  int([1, 2, 3])
except TypeError:
  print('数値に変換できません。')

この例では、リストを数値に変換しようとしているため、TypeErrorが発生します。
それを捉えて、「数値に変換できません。」というメッセージを出します。

IndexError

リストの範囲外の要素を参照しようとしたときに出ます。

try:
  [1, 2, 3][4]
except IndexError:
  print('リストの範囲外です。')

この例では、index が 4 の要素は存在しないため、IndexErrorが発生します。
上記の例では、リストの範囲外の要素を参照しようとしたときに「リストの範囲外です。」というメッセージを出します。

FileNotFoundError

存在しないファイルを開こうとしたときに出ます。

try:
  f = open('nonexistent_file.txt')
except FileNotFoundError:
  print('指定したファイルが存在しません。')

この例では、存在しないファイルを開こうとしているためにFileNotFoundErrorが発生します。
それを捉えて、「指定したファイルが存在しません。」というメッセージを出します。

Pythonの例外処理のコツ

Pythonで例外処理を上手に使うためのコツを以下に紹介します。

具体的な例外を捉える

エラーはさまざまな形で発生します。
そのため、どんなエラーでも捉えることができるExceptionを使うと、何が問題なのか見つけるのが難しくなることがあります。
そのため、可能な限り具体的な例外を捉えるようにしましょう。

具体的な例外を捉えることのメリットを、例を使って説明します。

あなたが「存在しないファイルを開いてしまった」というエラーを解決したいとしましょう。
Exceptionを使ってエラーを捉えると、「何かエラーが起きた」という情報しか得られません。

しかしFileNotFoundErrorを使ってエラーを捉えると、「存在しないファイルを開こうとした」という具体的な情報を得ることができます。
このように具体的な例外を捉えることで、エラーの原因を見つけやすくなります。

悪い例:

try:
  f = open('nonexistent_file.txt')
except Exception:
  print('エラーが発生しました。')

良い例:

try:
  f = open('nonexistent_file.txt')
except FileNotFoundError:
  print('指定したファイルが存在しません。')

エラーメッセージを出す

エラーが起きたときに、何が問題なのかを知るためにはエラーメッセージが重要です。
具体的なエラーメッセージを出すことで、エラーの原因を特定しやすくなります。

try:
    f = open('nonexistent_file.txt')
except FileNotFoundError:
    print('指定したファイルが存在しません。')

この例では、存在しないファイルを開こうとしたときにFileNotFoundErrorが発生します。
それを捉えて、「指定したファイルが存在しません。」というメッセージを出します。
これにより、何が問題だったのかを知ることができます。

さらに、場合によってはエラーメッセージを出すだけでは不十分な場合があります。
その場合は、エラーメッセージに加えて、エラーの原因となった値を出すと良いでしょう。

try:
  int('abc')
except ValueError as e:
  print('数値に変換できません。')
  print(e)

上記の例では、以下のようなエラーメッセージが出力されます。

数値に変換できません。
invalid literal for int() with base 10: 'abc'

このように、エラーメッセージに加えて、エラーの原因となった値を出すことで、エラーの原因を特定しやすくなります。

まとめ

Pythonでの例外処理は、予期しないエラーに対応するために重要です。
具体的な例外を捉える、明確なエラーメッセージを出す、適切な例外を出す、これらの方法を使って、エラーに上手く対処しましょう。
これにより、予期しないエラーにも対応できる、強固なプログラムを作ることができます。

目次