exceptとは?
exceptは、エラーが起きる可能性のある処理をtryとセットで使い、万が一エラーが発生したときに実行する処理を記述するための構文です。
日常生活で考えると、「料理中に卵を割ったら、もし殻が入ってしまったら取り除く」のように、予期せぬトラブル(エラー)が起きたときの対処法を決めておくことがありますよね。
Pythonのプログラムも同様で、エラーが発生すると通常はその場で停止してしまいます。ですが、try...except構文を使うと、エラーが起きてもプログラムを止めずに、あらかじめ決めておいた処理を続行させることができます。
エラーが起きてもすぐに停止せず、利用者に分かりやすいメッセージを表示したり、別の処理に切り替えたりできるため、プログラムの安定性や使いやすさを高めるために欠かせない機能といえます。
exceptの特徴
- エラーが起きる可能性のある処理を記述する
- プログラム実行中のエラー(例外)を検知し、強制終了するのを防ぐ
- エラーの種類(ZeroDivisionErrorなど)を指定し、エラーごとに対処を分けられる
- エラーが発生した場合に実行したい代替処理や、エラーメッセージの表示を行える
- else(エラーが起きなかった場合の処理)やfinally(エラーの有無に関わらず実行する処理)と組み合わせられる
【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング
基本構文
exceptを使った例外処理は、tryブロックとexceptブロックを組み合わせて記述します。まずtryブロックの中にエラーが起きる可能性のある処理を書き、exceptブロックでエラーが起きた場合の対処法を記述します。
最もシンプルな形から、特定のエラーを指定する方法、複数のエラーにまとめて対応する方法まで、状況に応じた書き方があります。ここでは、実際に動作する基本的なコード例を見ながら、exceptの使い方を学んでいきましょう。
まずは、計算でエラーが起きる処理をtryブロックに入れた例です。except:のようにエラーの種類を指定しないと、どんな種類のエラーでも検知します。
出力結果
エラーが発生しましたこの例では、tryブロック内で10 / 0というゼロでの割り算を実行しようとしています。
Pythonでは0での割り算はZeroDivisionErrorというエラーになるため、exceptブロックの処理が実行され、「エラーが発生しました」と表示されます。except: のみでエラー型を指定しない場合、あらゆる種類のエラーを検知します。
次は、exceptにValueErrorという特定のエラー型を指定する例です。
出力結果
数値に変換できませんこの例では、tryブロック内でint("イヌ")を実行し、文字列「イヌ」を整数に変換しようとしています。int関数は文字列を整数に変換できないためValueErrorが発生します。except ValueError: とエラー型を明示しているため、ValueErrorが発生した場合にのみexceptブロックが実行され、「数値に変換できません」と表示されます。
今度は、リストの範囲外(存在しないインデックス)にアクセスする例です。
出力結果
インデックスエラー: list index out of rangeこの例では、要素が2つ(インデックスは0と1)しかないリストに対し、animals[5](5番目のインデックス)にアクセスしようとしています。
リストの範囲を超えているためIndexErrorが発生します。except IndexError as e: でエラーを検知し、as e によってエラー内容(list index out of range)を変数eに格納し、エラーメッセージと一緒に出力しています。
実用例
ここからは、実際の開発で役立つexceptの実用的なコード例を紹介します。ファイル操作や数値計算、データ変換など、さまざまな場面で例外処理は必要になります。それぞれの状況を想定し、エラーが起きた場合にどう対処するかを見ていきましょう。サンプルコードは短くシンプルなので、ご自身のプログラムにも応用しやすいはずです。
ファイル読み込み時のエラー処理
ファイルを開く際、指定したファイルが存在しない(FileNotFoundError)ことはよくあります。exceptで検知することで、プログラムを停止させずに「ファイルが見つからない」と表示したり、代わりのデータを用意したりできます。
出力結果
ファイルが見つかりません
デフォルトのネコこの例では、tryブロックでanimal_data.txtというファイルを開こうとしています。もしファイルが存在しない場合、FileNotFoundErrorが発生します。exceptブロックでエラーを検知し、「ファイルが見つかりません」と表示した後、content変数に代わりの文字列「デフォルトのネコ」を代入しています。
ゼロ除算のエラー処理
数値計算で割り算をおこなう際、分母がゼロになるとZeroDivisionErrorが発生します。exceptで検知し、プログラムが停止するのを防ぎます。
出力結果
ゼロで割ることはできません
比率: 0この例では、変数animals_countが0のため、tryブロック内の100 / animals_countでZeroDivisionErrorが発生します。
exceptブロックがエラーを検知し、「ゼロで割ることはできません」と表示した後、ratio変数に0を代入しています。try...except構文を抜けた後、ratioの値(エラーが発生した場合は0)が出力されます。
リストのインデックスエラー処理
リストの要素にアクセスする際、存在しないインデックスを指定するとIndexErrorが起こります。exceptを使い、リストの長さを超えたアクセスを安全に処理する例です。
出力結果
指定された動物は存在しません
イヌこの例では、リスト(インデックスは0, 1, 2)に対し、animals[10]で存在しないインデックスにアクセスしようとしています。IndexErrorが発生するためexceptブロックが実行され、「指定された動物は存在しません」と表示した後、代わりにanimals[0](先頭の「イヌ」)を出力しています。
辞書のキーエラー処理
辞書から値を取得する際、存在しないキーを指定するとKeyErrorが発生します。getメソッドを使う方法もありますが、exceptで処理する方法も有効です。
出力結果
そのキーは存在しません
ウシこの例では、辞書に存在しないキー「farm」を指定して値を取得しようとしています。KeyErrorが発生するためexceptブロックが実行され、「そのキーは存在しません」と表示した後、animal変数にデフォルト値「ウシ」を代入しています。最後にanimal変数の値が出力されます。
型変換エラーの処理
Webサイトからのスクレイピングやファイル読み込みでは、データが欠けていたり、予期しない文字列が混じっていたりすることがあります。データを処理する際にtry...exceptを使うと、変換できないデータがあっても処理を止めずに、変換可能な数値だけを合計する、といった対応ができます。
出力結果
処理前の合計:0
「10」を数値に変換し加算しました。
「20」を数値に変換し加算しました。
「ネコ」は数値に変換できませんでした。
「30」を数値に変換し加算しました。
「None」は数値に変換できませんでした。
「40.5」は数値に変換できませんでした。
最終的な合計:60この例では、リストの要素をforループで一つずつ取り出し、int関数で整数への変換を試みています。"10"、"20"、"30"は正常に変換されtotal_ageに加算されます。"ネコ"とデータの欠損(None)と"40.5"(小数点の文字列)はintで変換できないためエラーが発生します。
except:でエラーを検知し、エラーメッセージを表示して処理を続行します。結果として、エラーがあってもループは止まらず、変換可能な数値(10, 20, 30)だけが合計されます。
複数の例外を同時に処理
ひとつのexceptブロックで、複数の異なるエラー型をまとめて検知することもできます。「except(エラー型1, エラー型2):」のように、タプル(()で囲んだもの)で指定します。
出力結果
エラーが発生: ValueErrorこの例では、tryブロック内で2種類のエラーが起こる可能性があります。int("パンダ")はValueError、もし数値に変換できてもその数値がリストの範囲外ならIndexErrorです。
except (ValueError, IndexError) as e:のようにタプルで指定すると、どちらのエラーが発生してもexceptブロックが実行されます。今回は先にint("パンダ")でValueErrorが発生したため、type(e).__name__(エラーの型名)にはValueErrorが表示されます。
else節とfinally節を使った処理
tryブロックには、else節とfinally節も追加できます。else節は、tryブロックでエラーが発生しなかった場合のみ実行されます。finally節は、エラーが発生したかどうかに関わらず、最後に必ず実行されます。ファイルやネットワーク接続を閉じるといったリソースの解放や後片付け処理に使われます。
出力結果
キリン
正常に実行されました
処理完了この例では、tryブロック内の処理(print(animal))がエラーなく成功しています。そのため、exceptブロックは実行されず、elseブロックが実行されて「正常に実行されました」と表示されます。
finallyブロックはエラーの有無に関わらず必ず実行されるため、「処理完了」も表示されます。もしtryでエラーが起きた場合は、except→finallyの順で実行されます。
まとめ
Pythonのexceptは、エラーが起きてもプログラムの実行を止めずに対処できる構文です。この記事では、基本的な使い方から実用例まで解説しました。
exceptが活躍する場面は次のようなケースです。
exceptが活躍する場面
- ファイル操作で、ファイルが見つからないとき
- ユーザー入力を数値に変換しようとして失敗したとき
- 外部のWebサイトやデータベース接続に失敗したとき
- データ処理中に、変換できない値が混じっていたとき
exceptを用いる上で、押さえておきたいポイントを覚えておきましょう。
重要なポイント
- tryブロックはエラーが起きそうな処理だけに絞る
- exceptには、できるだけ具体的なエラー型を指定する
- else(エラーなし)やfinally(必ず実行)も活用する
- asキーワードを使い、エラー内容を変数で受け取れる
初めてPythonを学ぶ方も、この記事で紹介したexceptを実際に書いて、基本的な使い方を試してみてください。
エラーが起きても停止しないプログラムは、実際の開発現場では必ず必要になります。マスターしておけば役立つこと間違いなしです。
ぜひexceptをマスターして、より安定して使いやすいプログラムを作成できるようになりましょう。