Python入門|エラーに強いコードを書く!例外処理(try-except)の使い方【レッスン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を用いたアプリ開発
例外処理とは?Pythonでエラーを安全に処理するための基本構文
この章ではPythonにおける「例外処理」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。
プログラミングをしていると予期しないエラーが発生することがあります。これを放置するとプログラムがクラッシュしてしまうため、エラーに対処する方法を学ぶことが重要です。
そこで役立つのが例外処理です。
Pythonにはエラーを検出して安全に処理する仕組みが備わっており、これによりプログラムを安全に実行し続けることができます。
Pythonにおける例外とは何か?
例外とはプログラムの実行中に発生するエラーの一種です。
例えば数値を0で割り算をしようとしたり、存在しないファイルを開こうとした場合、Pythonはその問題を検出して例外を発生させます。
例外が発生するとエラーメッセージが表示され、通常のプログラムの流れを中断させます。
しかし例外処理を使うことで、こうしたエラーをキャッチしてプログラムを中断させずに対応することが可能です。
主な組み込み例外
Pythonには多くのエラーに対応する組み込み例外が定義されています。以下はよく使われるものの一部です。
- SyntaxError: 構文エラー
- NameError: 未定義の変数や関数
- TypeError: 型が不適切な操作
- ValueError: 正しい型だが不適切な値
- ZeroDivisionError: 0での除算
- FileNotFoundError: ファイルが見つからない
- IndexError: リストの範囲外アクセス
これらの例外は自動的に発生してプログラムをクラッシュさせることがありますが、try-except構文でキャッチして適切に処理することが可能です。
try-except構文の基本
Pythonで例外処理を行う際には主にtry-except構文を使用します。
この構文を使うことでプログラムの一部を「試す」(try) ことができ、もしエラーが発生したらそのエラーを「捕まえる」(except) ことができます。
基本的な構文は以下の通りです。
try: # エラーが発生するかもしれない処理 except エラーの種類: # エラーが発生したときの処理
例えば0で割り算を行うコードで例外処理を使うと以下のようになります。
try: result = 10 / 0 except ZeroDivisionError: print("0で割ることはできません。")
このコードではZeroDivisionError
という例外が発生した場合に except
ブロックが実行され、エラーメッセージが表示されます。
もし例外が発生しなければ、except
の処理はスキップされます。
例外をキャッチして処理する例
より具体的な例を見てみましょう。
リストから要素を取得する際、範囲外のインデックスを指定した場合に IndexError
が発生します。
これも try-except
構文を使って安全に処理できます。
my_list = [1, 2, 3] try: print(my_list[5]) except IndexError: print("指定されたインデックスはリストの範囲外です。")
このコードではリスト my_list
に存在しないインデックスを指定していますが、IndexError
をキャッチしてエラーメッセージを表示します。
これによりプログラムがクラッシュせずに処理を続けることができます。
finallyブロックについて
try-except
構文にはエラーが発生したかどうかに関係なく実行されるfinallyブロックを追加することもできます。
例えば、ファイルを開いて処理を行った後に必ずファイルを閉じたい場合に使います。
try: file = open("data.txt", "r") # ファイル処理 except FileNotFoundError: print("ファイルが見つかりません。") finally: file.close()
この例ではファイルを開いた後にエラーが発生しても、finally
ブロックで必ずファイルを閉じる処理が実行されます。
finally
はリソースの解放や後処理に便利です。
まとめ
Pythonの例外処理を使うことで予期しないエラーが発生してもプログラムが安全に動作し続けるようにできます。
try-except
構文を使ってエラーをキャッチし、適切なエラーメッセージを表示することで、ユーザーに対してもわかりやすいプログラムを作成できます。
またfinally
ブロックを使用することで、リソースの後処理を確実に行うことができるため、例外処理はぜひマスターしておきたい技術です。
練習問題:例外処理を学ぼう!エラーを安全に処理するプログラム
ユーザーに2つの数値を入力してもらい、その数値を割り算するプログラムを作成しましょう。
割り算の結果を表示するようにし、0で割ろうとした場合や数値以外を入力した場合には適切なエラーメッセージを表示する例外処理を組み込んでください。
また、処理が終了したことを知らせるメッセージも表示しましょう。
問題の詳細条件
以下の要件に従ってコードを完成させてください。
- ユーザーから2つの整数を入力し、変数
num1
とnum2
に代入すること。 num1
をnum2
で割り算し、その結果を表示すること。ZeroDivisionError
例外処理を使用して、0で割ろうとした場合に「0で割ることはできません」と表示すること。ValueError
例外処理を使用して、数値以外を入力した場合に「有効な整数を入力してください」と表示すること。- 最後に必ず「処理を終了しました」と表示すること。
ただし、以下のような実行結果となるコードを書くこと。
1つ目の数字を入力してください: 10 2つ目の数字を入力してください: 0 エラー: 0で割ることはできません。 処理を終了しました。
【ヒント】難しいと感じる人だけ見よう
1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。
- ヒント1【コードの構成を見る】
-
正解のコードは上から順に以下のような構成となっています。
1.tryブロックの開始
1-1. 変数num1
に整数値の入力を求める
1-2. 変数num2
に整数値の入力を求める
1-3. 変数num1
をnum2
で割り、その結果をresult
に格納
1-4. 割り算の結果result
を表示する2.exceptブロック
2-1.ZeroDivisionError
の例外処理
2-1-1. 0で割ろうとした場合のエラーメッセージを表示
2-2.ValueError
の例外処理
2-2-1. 数値以外が入力された場合のエラーメッセージを表示3.finallyブロック
3-1. 処理終了メッセージを表示
- ヒント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("処理を終了しました。")
正解例の詳細解説
このプログラムではPythonの例外処理を使用してエラーを安全に処理する方法を学びます。
特に、ゼロ除算や無効な入力(数値以外)に対する対策がどのように行われるかを説明します。
- 詳細解説
-
tryブロックの解説
try: num1 = int(input("1つ目の数字を入力してください: ")) num2 = int(input("2つ目の数字を入力してください: ")) result = num1 / num2 print(f"結果: {result}")
try
ブロックはエラーが発生する可能性がある部分を囲むために使われます。もしエラーが発生した場合、プログラムがクラッシュせずに次の処理へ進めます。input()
関数でユーザーから数値を入力してもらい、その入力をint()
関数で整数に変換しています。もし数値以外が入力されるとエラーが発生します。- その後、
num1
をnum2
で割り、結果をprint()
で表示しています。もしnum2
が0の場合、ゼロ除算エラー(ZeroDivisionError) が発生します。
except ZeroDivisionError
の解説except ZeroDivisionError: print("エラー: 0で割ることはできません。")
except ZeroDivisionError
ブロックは0で割り算しようとした場合に発生するエラーをキャッチします。ゼロで割り算を行うことは数学的に定義されないため、このエラーメッセージが表示して次の処理へ進みます。
except ValueError
の解説except ValueError: print("エラー: 有効な整数を入力してください。")
except ValueError
ブロックは数値以外の入力(例えば、文字や記号)がされた場合に発生するエラーをキャッチします。int()
関数が数値に変換できない入力があると、このエラーメッセージが表示されます。finally
の解説finally: print("処理を終了しました。")
finally
ブロックは例外が発生したかどうかにかかわらず、必ず実行される部分です。ここでは「処理を終了しました」というメッセージを必ず表示して、プログラムの終了をユーザーに知らせています。
FAQ|try-exceptによる安全なエラー処理
- Q1. try-except文はどんなときに使うべきですか?
-
ユーザー入力や外部ファイル読み込みなど、エラーが発生する可能性のある処理に使います。
- Q2. exceptで特定のエラーだけを捕捉するには?
-
except ZeroDivisionError:
のように、エラーの種類を明示して限定的に捕捉できます。
- Q3. finally文は何のために使うのですか?
-
エラーの有無に関係なく、最後に必ず実行したい処理(例:ファイルのクローズなど)に使います。
質問用コンタクトフォーム
この記事はAIを用いて書いた記事です。
人間の目による確認も行っていますが、もし間違い等ありましたらご指摘頂けると大変助かります。