【Python】レッスン2-9:例外処理を理解しよう

ながみえ
【Python学習記事のアイキャッチ画像】Lesson2-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副業)

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-9 例外処理の基礎を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆1 ハイアンドローゲームを作ろう

例外と例外処理の基礎|代表例と try-except/finally

例外処理 はプログラム中で起こりうるエラー(例外)を安全に受け止めて処理を続行するための仕組みです。

発生しうる例外を想定して分岐を書き、必要に応じてelsefinallyで“成功時の処理”や“後片付け”をまとめることで、コードの見通しと堅牢性がぐっと高まります。

この知識を身につけると、ゼロ除算・型変換の失敗・ファイル/ネットワークの読み書きエラーなどでプログラムが落ちるのを防ぎ、ユーザーへのわかりやすいメッセージ表示、リトライやログ出力、リソースのクリーンアップまで意図通りに制御できるようになります。

実務でも学習でも「落ちないコード」を書くための必須スキルです。

本文では、try/exceptの基本から、exceptの書き分け、elsefinallyの使いどころ、よくある落とし穴までを順に解説します。

サンプルを動かしながら、堅牢なエラーハンドリングを身につけていきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

例外とは何か?|意味と代表的な組み込み例外一覧

例外とはプログラムの実行中に発生するエラーの一種です。

例えば数値を0で割り算をしようとしたり、存在しないファイルを開こうとした場合、Pythonはその問題を検出して例外を発生させます。

例外が発生するとエラーメッセージが表示され、プログラムは強制終了してしまいます。

例外には様々なパターンが考えられますが、特によく起こる例外はPython標準で定義されており、それを 組み込み例外 と言います。

以下はよく使われるものの一部です。

  • SyntaxError: 構文エラー
  • NameError: 未定義の変数や関数
  • TypeError: 型が不適切な操作
  • ValueError: 正しい型だが不適切な値
  • ZeroDivisionError: 0での除算
  • FileNotFoundError: ファイルが見つからない
  • IndexError: リストの範囲外アクセス

これらの例外は自動的に発生してプログラムをクラッシュさせることがありますが、try-except構文 でキャッチして適切に処理することが可能です。

組み込み例外とは

Pythonの 組み込み例外(built-in exceptions)とは、Python言語にあらかじめ定義されている例外クラスのことです。

プログラム実行中にエラーが発生した際、Pythonはこれらの例外を自動的に発生させて処理を中断します。

自作の例外を定義する際にも、これらの 組み込み例外クラスを継承 することが一般的です。

例外処理の基本|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 ブロックを使用することで、リソースの後処理を確実に行うことができるため、例外処理はぜひマスターしておきたい技術です。

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。

練習問題:例外処理を使ってみよう

この記事で学習した「例外処理」を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|エラーを安全に処理するプログラム

ユーザーから2つの数値を受け取り、割り算を行うプログラムを作成してください。

発生しうるエラーを例外処理(try/except)で扱い、最後に処理が終わったことを知らせるメッセージを表示しましょう。

以下の要件に従ってコードを完成させてください。

  • input()で2つの整数を受け取り、num1num2 に代入すること。
  • num1 / num2 を実行し、成功時は結果を表示すること。
  • ZeroDivisionError を捕捉して、0で割ろうとした場合のエラーメッセージを表示すること。
  • ValueError を捕捉して、数値以外の入力時のエラーメッセージを表示すること。
  • 必ず実行する終了メッセージを finally で出力すること。

ただし、以下のような実行結果となるコードを書くこと。

1つ目の数字を入力してください: 10
2つ目の数字を入力してください: 0
エラー: 0で割ることはできません。
処理を終了しました。

ヒント|難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.tryブロックの開始
2.exceptブロック
 2-1. ZeroDivisionError の例外処理
 2-2. ValueError の例外処理
3.finallyブロック

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

try:
    num1 = int(input("1つ目の数字を入力してください: "))
    num2 = int(input("2つ目の数字を入力してください: "))

    result = num1 / num2
    print(f"結果: {result}")

"""【穴埋め問題1】
ここで、0で割った場合にエラーメッセージを表示する例外処理(ZeroDivisionError)を追加してください。
"""

"""【穴埋め問題2】
ここで、数値以外を入力した場合にエラーメッセージを表示する例外処理(ValueError)を追加してください。
"""

"""【穴埋め問題3】
ここで、処理が終了したことを知らせるメッセージを表示するfinallyブロックを追加してください。
"""

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例|安全な割り算ハンドラープログラム

例えば以下のようなプログラムが考えられます。

Q
正解コード
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("処理を終了しました。")
もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson2-9 例外処理の基礎を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson2-☆1 ハイアンドローゲームを作ろう

例外処理の疑問解消|FAQと用語のまとめ

初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。

理解を深めたいときや、ふと疑問に感じたときに役立ててください。

FAQ|例外処理に関するよくある質問

Q
Q1. try-except文はどんなときに使うべきですか?

ユーザー入力や外部ファイル読み込みなど、エラーが発生する可能性のある処理に使います。

Q
Q2. exceptで特定のエラーだけを捕捉するには?

except ZeroDivisionError: のように、エラーの種類を明示して限定的に捕捉できます。

Q
Q3. finally文は何のために使うのですか?

エラーの有無に関係なく、最後に必ず実行したい処理(例:ファイルのクローズなど)に使います。

Python用語集|例外処理に関する用語一覧

今回の記事で出てきた用語・関数などを一覧で紹介します。

このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。

Python用語定義・使い方の概要解説記事へのリンク
例外処理プログラム中で発生するエラー(例外)に対処する仕組みで、エラー時のクラッシュを防ぐために使う本記事
組み込み例外Pythonにあらかじめ定義されている例外クラス。TypeErrorValueError などが含まれる本記事
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
記事URLをコピーしました