【Python】レッスン2-9:例外処理を理解しよう
一つ前のLessonではエラーメッセージについて学習しました。
今回は例外処理の基礎について見ていきます。
Lesson1:基礎文法編
Lesson2:制御構造編
・Lesson2-1:比較演算子と論理演算子を理解しよう
・Lesson2-2:条件分岐(if-else文)を理解しよう
・Lesson2-3:条件分岐(if-elif-else文)を理解しよう
・Lesson2-4:条件分岐(match文)を理解しよう
・Lesson2-5:繰り返し処理(for文)を理解しよう
・Lesson2-6:繰り返し処理(while文)を理解しよう
・Lesson2-7:繰り返しの制御を理解しよう
・Lesson2-8:エラーメッセージを読めるようになろう
・Lesson2-9:例外処理の基礎を理解しよう ◁今回はココ
・練習問題2-1:ハイアンドロー ゲームを作ろう
・練習問題2-2:数字当てゲームを作ろう
・練習問題2-3:簡単なじゃんけんゲームを作ろう
Lesson3:関数とスコープ編
Lesson4:データ構造編
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)
例外と例外処理の基礎|代表例と try-except/finally
例外処理 はプログラム中で起こりうるエラー(例外)を安全に受け止めて処理を続行するための仕組みです。
発生しうる例外を想定して分岐を書き、必要に応じてelse
やfinally
で“成功時の処理”や“後片付け”をまとめることで、コードの見通しと堅牢性がぐっと高まります。
この知識を身につけると、ゼロ除算・型変換の失敗・ファイル/ネットワークの読み書きエラーなどでプログラムが落ちるのを防ぎ、ユーザーへのわかりやすいメッセージ表示、リトライやログ出力、リソースのクリーンアップまで意図通りに制御できるようになります。
実務でも学習でも「落ちないコード」を書くための必須スキルです。
本文では、try
/except
の基本から、except
の書き分け、else
・finally
の使いどころ、よくある落とし穴までを順に解説します。
サンプルを動かしながら、堅牢なエラーハンドリングを身につけていきましょう。
例外とは何か?|意味と代表的な組み込み例外一覧
例外とはプログラムの実行中に発生するエラーの一種です。
例えば数値を0で割り算をしようとしたり、存在しないファイルを開こうとした場合、Pythonはその問題を検出して例外を発生させます。
例外が発生するとエラーメッセージが表示され、プログラムは強制終了してしまいます。
例外には様々なパターンが考えられますが、特によく起こる例外はPython標準で定義されており、それを 組み込み例外 と言います。
以下はよく使われるものの一部です。
- SyntaxError: 構文エラー
- NameError: 未定義の変数や関数
- TypeError: 型が不適切な操作
- ValueError: 正しい型だが不適切な値
- ZeroDivisionError: 0での除算
- FileNotFoundError: ファイルが見つからない
- IndexError: リストの範囲外アクセス
これらの例外は自動的に発生してプログラムをクラッシュさせることがありますが、try-except構文 でキャッチして適切に処理することが可能です。
例外処理の基本|try-except の書き方と使いどころ
Pythonで例外処理を行う際には主に try-except構文 を使用します。
この構文を使うことでプログラムの一部を「試す」(try) ことができ、もしエラーが発生したらそのエラーを「捕まえる」(except) ことができます。
例外処理の基本|try-except構文の使い方
基本的な構文は以下の通りです。
try: # エラーが発生するかもしれない処理 except エラーの種類: # エラーが発生したときの処理
例えば0で割り算を行うコードで例外処理を使うと以下のようになります。
try: result = 10 / 0 # エラーが発生するかもしれない処理 except ZeroDivisionError: # もしZeroDivisionErrorが発生したなら print("0で割ることはできません。") # この処理を実行
このコードではZeroDivisionError
という例外が発生した場合に except
ブロックが実行され、「0で割ることはできません。」というメッセージが表示されます。
もし例外が発生しなければ、except
の処理はスキップされます。
IndexError を捕捉して対処する例|メッセージ表示と復帰
より具体的な例を見てみましょう。
リストから要素を取得する際、範囲外のインデックスを指定した場合に IndexError
が発生します。
これも try-except
構文を使って安全に処理できます。
my_list = [1, 2, 3] # 1と2と3の3つの数値からなるリストmy_listを定義 try: print(my_list[5]) # リストmy_listの5番目の数値を出力 except IndexError: # もしIndexErrorが発生したなら print("指定されたインデックスはリストの範囲外です。")
このコードではリスト my_list
に存在しないインデックスを指定していますが、IndexError
をキャッチしてエラーメッセージを表示します。
これによりプログラムがクラッシュせずに処理を続けることができます。
finally の役割|後片付けを必ず実行する書き方
try-except
構文にはエラーが発生したかどうかに関係なく実行される finallyブロック を追加することもできます。
例えば、ファイルを開いて処理を行った後に必ずファイルを閉じたい場合に使います。
try: file = open("data.txt", "r") # data.txtファイルの読み込み処理 except FileNotFoundError: # もしFileNotFoundErrorが発生したなら print("ファイルが見つかりません。") finally: file.close() # エラーが起きても起きなくても、ファイルを閉じる
この例ではファイルを開いた後にエラーが発生しても、finally
ブロックで必ずファイルを閉じる処理が実行されます。
finally
はリソースの解放や後処理に便利です。
まとめ|try-except と finally で落ちないコードを書こう
Pythonの例外処理を使うことで予期しないエラーが発生してもプログラムが安全に動作し続けるようにできます。
try-except
構文を使ってエラーをキャッチし、適切なエラーメッセージを表示することで、ユーザーに対してもわかりやすいプログラムを作成できます。
またfinally
ブロックを使用することで、リソースの後処理を確実に行うことができるため、例外処理はぜひマスターしておきたい技術です。
- サイト改善アンケート|ご意見をお聞かせください(1分で終わります)
-
本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。1分だけ、ご協力いただけますと幸いです。
【Python】サイト改善アンケート
練習問題:例外処理を使ってみよう
この記事で学習した「例外処理」を復習する練習問題に挑戦しましょう。
問題|エラーを安全に処理するプログラム
ユーザーから2つの数値を受け取り、割り算を行うプログラムを作成してください。
発生しうるエラーを例外処理(try/except)で扱い、最後に処理が終わったことを知らせるメッセージを表示しましょう。
以下の要件に従ってコードを完成させてください。
input()
で2つの整数を受け取り、num1
とnum2
に代入すること。num1 / num2
を実行し、成功時は結果を表示すること。ZeroDivisionError
を捕捉して、0で割ろうとした場合のエラーメッセージを表示すること。ValueError
を捕捉して、数値以外の入力時のエラーメッセージを表示すること。- 必ず実行する終了メッセージを
finally
で出力すること。
ただし、以下のような実行結果となるコードを書くこと。
1つ目の数字を入力してください: 10 2つ目の数字を入力してください: 0 エラー: 0で割ることはできません。 処理を終了しました。
ヒント|難しいと感じる人だけ見よう
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1.tryブロックの開始
2.exceptブロック
2-1.ZeroDivisionError
の例外処理
2-2.ValueError
の例外処理
3.finallyブロック
- ヒント2【穴埋め問題にする】
-
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
try: num1 = int(input("1つ目の数字を入力してください: ")) num2 = int(input("2つ目の数字を入力してください: ")) result = num1 / num2 print(f"結果: {result}") """【穴埋め問題1】 ここで、0で割った場合にエラーメッセージを表示する例外処理(ZeroDivisionError)を追加してください。 """ """【穴埋め問題2】 ここで、数値以外を入力した場合にエラーメッセージを表示する例外処理(ValueError)を追加してください。 """ """【穴埋め問題3】 ここで、処理が終了したことを知らせるメッセージを表示するfinallyブロックを追加してください。 """
このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。
解答例|安全な割り算ハンドラープログラム
例えば以下のようなプログラムが考えられます。
- 正解コード
-
try: # ユーザーに数値の入力を求める num1 = int(input("1つ目の数字を入力してください: ")) num2 = int(input("2つ目の数字を入力してください: ")) # 例外処理を使ってゼロ除算を防ぐ result = num1 / num2 print(f"結果: {result}") # ZeroDivisionError の例外処理 except ZeroDivisionError: print("エラー: 0で割ることはできません。") # ValueError の例外処理(整数以外が入力された場合) except ValueError: print("エラー: 有効な整数を入力してください。") # 最後に必ず実行されるブロック(今回は簡単な終了メッセージ) finally: print("処理を終了しました。")
例外処理の疑問解消|FAQと用語のまとめ
初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。
理解を深めたいときや、ふと疑問に感じたときに役立ててください。
FAQ|例外処理に関するよくある質問
- Q1. try-except文はどんなときに使うべきですか?
-
ユーザー入力や外部ファイル読み込みなど、エラーが発生する可能性のある処理に使います。
- Q2. exceptで特定のエラーだけを捕捉するには?
-
except ZeroDivisionError:
のように、エラーの種類を明示して限定的に捕捉できます。
- Q3. finally文は何のために使うのですか?
-
エラーの有無に関係なく、最後に必ず実行したい処理(例:ファイルのクローズなど)に使います。
Python用語集|例外処理に関する用語一覧
今回の記事で出てきた用語・関数などを一覧で紹介します。
このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。
Python用語 | 定義・使い方の概要 | 解説記事へのリンク |
---|---|---|
例外処理 | プログラム中で発生するエラー(例外)に対処する仕組みで、エラー時のクラッシュを防ぐために使う | 本記事 |
組み込み例外 | Pythonにあらかじめ定義されている例外クラス。TypeError や ValueError などが含まれる | 本記事 |
try-except 構文 | エラーが発生しそうな処理を try 節に書き、発生した例外に応じて except 節で対応する構文 | 本記事 |
finally ブロック | try-except 構文の最後に書き、例外の有無にかかわらず必ず実行される処理を記述する | 本記事 |
ZeroDivisionError | 数値を0で割ったときに発生する例外 | 本記事 |
FileNotFoundError | 指定したファイルが存在しないときに発生する例外 | 本記事 |
SyntaxError | 構文に誤りがあるときに発生する例外 | Lesson2-8 |
NameError | 定義されていない変数や関数を使用したときに発生する例外 | Lesson2-8 |
TypeError | 不正なデータ型で演算や操作を行おうとしたときに発生する例外 | Lesson2-8 |
IndexError | シーケンスの存在しないインデックスにアクセスしようとしたときに発生する例外 | Lesson2-8 |
ValueError | 型は正しいが値が不正なときに発生する例外(例:int("abc") ) | Lesson2-8 |