【Python】レッスン2-09:例外処理の基礎を理解しよう

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:例外処理の基礎

この記事の練習問題で使用する知識:
入力と出力の基本コメントの書き方変数の宣言と代入基本データ型と算術演算子文字列の操作、フォーマット文字列比較演算子と論理演算子条件分岐(if-else文)条件分岐(elif文)条件分岐(match文)繰り返し処理(for文)繰り返し処理(while文)繰り返しの制御エラーメッセージ例外処理の基礎

<<前の問題 問題集Top 次の問題>>

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

Python練習問題2-9:例外処理を学ぼう!エラーを安全に処理するプログラム

ユーザーに2つの数値を入力してもらい、その数値を割り算するプログラムを作成しましょう。

割り算の結果を表示するようにし、0で割ろうとした場合や数値以外を入力した場合には適切なエラーメッセージを表示する例外処理を組み込んでください。

また、処理が終了したことを知らせるメッセージも表示しましょう。

この問題の要件

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

  • ユーザーから2つの整数を入力し、変数 num1num2 に代入すること。
  • num1num2 で割り算し、その結果を表示すること。
  • ZeroDivisionError 例外処理を使用して、0で割ろうとした場合に「0で割ることはできません」と表示すること。
  • ValueError 例外処理を使用して、数値以外を入力した場合に「有効な整数を入力してください」と表示すること。
  • 最後に必ず「処理を終了しました」と表示すること。

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

*****↓↓正解コードの実行結果の例↓↓*****

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

この問題を解くヒント

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

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

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

1.tryブロックの開始
 1-1. 変数 num1 に整数値の入力を求める
 1-2. 変数 num2 に整数値の入力を求める
 1-3. 変数 num1num2 で割り、その結果を 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() 関数で整数に変換しています。もし数値以外が入力されるとエラーが発生します。
  • その後、num1num2 で割り、結果を 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ブロックは例外が発生したかどうかにかかわらず、必ず実行される部分です。

ここでは「処理を終了しました」というメッセージを必ず表示して、プログラムの終了をユーザーに知らせています。

<<前の問題 問題集Top 次の問題>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Python記事トップへ戻る
    トップページへ戻る