【Pythonを使い倒す】エラー対処に苦労しているあなたへ、例外処理に適切に対応できるようになろう!

前回の記事では、リストをcsvファイルとして保存したり、csvファイルを読み込んでリストを作れるようになる書き方を解説をしました。今回は例外処理を解説します。
例外とは、コードを実行した際に発生するエラーのことです。
例外処理を学んでエラーを扱えるようになりましょう。

どんな例外があるのか?

例外は、例えば以下のような場合に発生します。

  • 開こうとしたファイルが存在しない場合
  • リストの範囲外の要素にアクセスしようとした場合
  • 0で割った場合
  • etc…

などです。

ファイルが存在しない場合の例外処理

以下の例では、ファイルが存在しない場合の例外を扱っています。
tryの中で発生した例外を、exceptで場合分けをしています。

ファイルが存在しない場合の例外処理
try:
   with open("fruit.txt", "r") as f:
       print(f.read())
except FileNotFoundError as e: # FileNotFoundErrorは例外クラス名
   print("ファイルが見つかりません", e)
except Exception as e: # Exceptionは、それ以外の例外が発生した場合
   print(e)
実行結果

ファイルが見つかりません [Errno 2] No such file or directory: ‘fruit.txt’

それではコードを見ていきましょう。
try構文の中でfruit.txtを読み込んでいます。
このfruit.txtは存在しないのでエラーが発生します。

そして、exceptを使ってエラーの種類による場合分けをします。
exceptの横には例外クラスを書きます。
FileNotFoundErrorはファイルが存在しなかった場合の例外クラス名になります。
その場合メッセージとエラーの内容をプリントします。

また、Exceptionという例外クラス名は、それ以外の例外が発生した場合になります。
この場合エラーの内容をプリントします。
実行すると上記のように「ファイルが見つかりません。」というメッセージとエラーの内容が表示されました。

リストの範囲外の要素にアクセスした場合の例外処理

また、以下の例ではリストの範囲外の要素にアクセスした場合の例外を扱っています。

リストの範囲外の要素にアクセスした場合の例外処理
fruits = ["Apple", "Banana", "Orange"]
try:
   print(fruits[3]) # 範囲外の要素にアクセス
except IndexError as e: # IndexErrorは範囲外の要素にアクセスした例外
   print("インデックスが範囲外です", e)
except Exception as e:
   print(e)
実行結果

インデックスが範囲外です list index out of range

こちらのコードを見ていきましょう。
リスト fruits の中には3つの文字列が入っています。

try構文の中でこのfruitsの3番目の要素にアクセスしてプリントしようとしています。
このリストの要素は0、1、2と数えますので、
範囲外の要素にアクセスしていることになります。

このような例外を検知するためにはIndexErrorという例外クラスを使います。
今回はこの場合にメッセージとエラーの内容をプリントします。
実行すると上記のように「インデックスが範囲外です。」というメッセージとエラーの内容が表示されまた。

リストの範囲外の要素にアクセスした場合の例外を検知することができましたね。
このように例外処理を行うことでより安全で保守背の高いコードを書くことができます。

他の例外クラスについては、こちらに一覧があります
https://docs.python.org/3.6/library/exceptions.html#built-in-exceptions
興味のある方は眺めてみてくださいね。
今回は例外処理を解説しました。
エラーに適切に対処できるようになりましょう。