【Python】例外処理とループ処理を組み合わせた基本的な書き方

Pythonプログラミングでは、エラーが発生してもプログラムを止めずに処理を続けるために「例外処理」と「ループ処理」を組み合わせることが重要です。

この記事では、forループやwhileループに例外処理を組み合わせる基本的な方法から、実際のプログラムでの応用例までをわかりやすく解説します。

初心者の方でも理解しやすいように、具体的なサンプルコードとその解説を交えながら進めていきますので、ぜひ参考にしてください。

目次から探す

例外処理とループ処理の組み合わせ

Pythonでは、例外処理とループ処理を組み合わせることで、エラーが発生してもプログラムが停止せずに処理を続行することができます。

これにより、より堅牢で信頼性の高いコードを書くことが可能になります。

ここでは、forループとwhileループに例外処理を組み合わせる方法について詳しく解説します。

例外処理を含むforループ

基本的な例

forループは、リストやタプルなどのシーケンスを反復処理するために使用されます。

以下は、forループに例外処理を組み合わせた基本的な例です。

numbers = [1, 2, 0, 4, 5]
for number in numbers:
    try:
        result = 10 / number
        print(f"10 / {number} = {result}")
    except ZeroDivisionError:
        print("0で割ることはできません")

このコードでは、リストnumbersの各要素に対して10を割り算しています。

0で割り算しようとするとZeroDivisionErrorが発生しますが、例外処理を使ってエラーメッセージを表示し、ループを続行します。

例外発生時の処理

例外が発生した場合に特定の処理を行うことも可能です。

例えば、エラーが発生した場合に特定の値を代入するなどの処理を行うことができます。

numbers = [1, 2, 0, 4, 5]
results = []
for number in numbers:
    try:
        result = 10 / number
    except ZeroDivisionError:
        result = None
        print("0で割ることはできません")
    results.append(result)
print("計算結果:", results)

このコードでは、例外が発生した場合にresultNoneを代入し、計算結果をリストresultsに追加しています。

例外処理を含むwhileループ

基本的な例

whileループは、条件が真である限り繰り返し処理を行います。

以下は、whileループに例外処理を組み合わせた基本的な例です。

count = 0
while count < 5:
    try:
        if count == 2:
            raise ValueError("カウントが2になりました")
        print(f"カウント: {count}")
    except ValueError as e:
        print(e)
    count += 1

このコードでは、カウントが2になったときにValueErrorを発生させ、例外処理でエラーメッセージを表示しています。

例外発生時の処理

whileループでも、例外が発生した場合に特定の処理を行うことができます。

例えば、エラーが発生した場合にループを終了するなどの処理を行うことができます。

count = 0
while count < 5:
    try:
        if count == 2:
            raise ValueError("カウントが2になりました")
        print(f"カウント: {count}")
    except ValueError as e:
        print(e)
        break
    count += 1

このコードでは、カウントが2になったときにValueErrorを発生させ、例外処理でエラーメッセージを表示した後、break文でループを終了しています。

ループ内での例外処理のベストプラクティス

例外の具体的な捕捉

例外処理では、具体的な例外を捕捉することが重要です。

これにより、予期しないエラーが発生した場合でも適切に対処できます。

numbers = [1, 2, 'a', 4, 5]
for number in numbers:
    try:
        result = 10 / number
    except ZeroDivisionError:
        print("0で割ることはできません")
    except TypeError:
        print("数値以外の値が含まれています")

このコードでは、ZeroDivisionErrorTypeErrorの両方を捕捉し、それぞれに対して異なるエラーメッセージを表示しています。

ログの記録

エラーが発生した場合にログを記録することも重要です。

これにより、後でエラーの原因を特定しやすくなります。

import logging
logging.basicConfig(level=logging.ERROR)
numbers = [1, 2, 0, 4, 5]
for number in numbers:
    try:
        result = 10 / number
    except ZeroDivisionError as e:
        logging.error("0で割ることはできません: %s", e)

このコードでは、loggingモジュールを使用してエラーメッセージをログに記録しています。

リトライ処理

エラーが発生した場合にリトライ処理を行うこともあります。

これにより、一時的なエラーが発生した場合でも再試行することで成功する可能性が高まります。

import time
numbers = [1, 2, 0, 4, 5]
for number in numbers:
    retries = 3
    while retries > 0:
        try:
            result = 10 / number
            print(f"10 / {number} = {result}")
            break
        except ZeroDivisionError:
            print("0で割ることはできません。リトライします...")
            retries -= 1
            time.sleep(1)

このコードでは、ZeroDivisionErrorが発生した場合に最大3回までリトライを行い、1秒間の待機時間を設けています。

以上が、例外処理とループ処理を組み合わせた基本的な書き方です。

これらのテクニックを活用することで、より堅牢で信頼性の高いPythonコードを書くことができます。

実践例

ここでは、例外処理とループ処理を組み合わせた具体的な実践例を紹介します。

これらの例を通じて、実際のプログラムでどのようにこれらの技術を活用するかを理解しましょう。

ファイル読み込み時の例外処理とループ

ファイルを読み込む際には、ファイルが存在しない場合や読み込みエラーが発生する可能性があります。

これらのエラーを適切に処理するために、例外処理とループを組み合わせる方法を見ていきます。

ファイルの存在確認

まず、ファイルが存在するかどうかを確認する方法を見てみましょう。

以下のコードは、指定されたファイルが存在するかどうかを確認し、存在しない場合はエラーメッセージを表示します。

import os
file_path = 'example.txt'
if os.path.exists(file_path):
    print(f"{file_path} は存在します。")
else:
    print(f"{file_path} は存在しません。")

読み込みエラーの処理

次に、ファイルを読み込む際に発生する可能性のあるエラーを処理する方法を見てみましょう。

以下のコードは、ファイルを読み込む際に例外処理を使用してエラーをキャッチし、エラーメッセージを表示します。

file_path = 'example.txt'
try:
    with open(file_path, 'r') as file:
        content = file.read()
        print(content)
except FileNotFoundError:
    print(f"{file_path} が見つかりません。")
except IOError:
    print(f"{file_path} の読み込み中にエラーが発生しました。")

ユーザー入力の検証とループ

ユーザーからの入力を受け取る際には、無効な入力が行われる可能性があります。

これを防ぐために、入力値の検証と再試行を行う方法を見ていきます。

入力値の検証

まず、ユーザーからの入力値を検証する方法を見てみましょう。

以下のコードは、ユーザーに数値を入力させ、その数値が有効かどうかを確認します。

try:
    user_input = int(input("数値を入力してください: "))
    print(f"入力された数値は {user_input} です。")
except ValueError:
    print("無効な入力です。数値を入力してください。")

無効な入力の再試行

次に、無効な入力が行われた場合に再試行を行う方法を見てみましょう。

以下のコードは、ユーザーが有効な数値を入力するまで再試行を行います。

while True:
    try:
        user_input = int(input("数値を入力してください: "))
        print(f"入力された数値は {user_input} です。")
        break
    except ValueError:
        print("無効な入力です。数値を入力してください。")

APIリクエストのリトライ処理

APIリクエストを行う際には、タイムアウトや接続エラーが発生する可能性があります。

これらのエラーを処理し、リトライを行う方法を見ていきます。

リクエストの送信

まず、APIリクエストを送信する基本的な方法を見てみましょう。

以下のコードは、requestsライブラリを使用してAPIリクエストを送信します。

import requests
url = 'https://api.example.com/data'
try:
    response = requests.get(url)
    response.raise_for_status()
    data = response.json()
    print(data)
except requests.exceptions.RequestException as e:
    print(f"リクエスト中にエラーが発生しました: {e}")

タイムアウトや接続エラーの処理

次に、タイムアウトや接続エラーが発生した場合にリトライを行う方法を見てみましょう。

以下のコードは、リクエストが成功するまで最大3回リトライを行います。

import requests
import time
url = 'https://api.example.com/data'
max_retries = 3
retry_count = 0
while retry_count < max_retries:
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()
        data = response.json()
        print(data)
        break
    except requests.exceptions.RequestException as e:
        retry_count += 1
        print(f"リクエスト中にエラーが発生しました: {e}")
        if retry_count < max_retries:
            print("リトライします...")
            time.sleep(2)
        else:
            print("最大リトライ回数に達しました。")

これらの実践例を通じて、例外処理とループ処理を組み合わせる方法を理解できたでしょう。

これらの技術を活用して、より堅牢なプログラムを作成してください。

目次から探す