PythonでネットワークエラーとAPIのレスポンスエラーを処理する方法

この記事では、PythonでネットワークエラーとAPIのレスポンスエラーを処理する方法について深く探ります。具体的なコード例とその解説、応用例を含めています。

目次

はじめに

ネットワークエラーとAPIのレスポンスエラーは、外部のAPIに接続する際に避けては通れない問題です。適切なエラーハンドリングがないと、ユーザーエクスペリエンスが低下するばかりか、デバッグが困難になります。

基本的なエラーハンドリング

Pythonでは`try`、`except`ブロックを用いて基本的なエラーハンドリングを行います。

基本形

import requests

try:
    response = requests.get("https://api.example.com/data")
    response.raise_for_status()
except requests.RequestException as e:
    print(f"エラーが発生しました: {e}")

このコードでは`requests`ライブラリを用いてAPIに接続します。`try`ブロック内でエラーが発生した場合は、`except`ブロックが実行され、エラー内容が出力されます。

ネットワークエラーの処理

タイムアウトの設定

try:
    response = requests.get("https://api.example.com/data", timeout=5)
    response.raise_for_status()
except requests.Timeout as e:
    print(f"タイムアウトエラー: {e}")

`timeout`パラメータでAPIの応答時間の最大値を設定できます。設定した時間を超えると`requests.Timeout`エラーが発生します。

APIのレスポンスエラーの処理

ステータスコードのチェック

try:
    response = requests.get("https://api.example.com/data")
    if response.status_code != 200:
        response.raise_for_status()
except requests.HTTPError as e:
    print(f"HTTPエラー: {e}")

ステータスコードが200以外の場合、`raise_for_status()`メソッドで`requests.HTTPError`エラーを発生させます。

応用例

例1:リトライ機構の実装

from time import sleep

for i in range(3):
    try:
        response = requests.get("https://api.example.com/data", timeout=5)
        response.raise_for_status()
        break
    except requests.RequestException as e:
        print(f"リトライ{i + 1}回目: {e}")
        sleep(2)

例2:エラーログの出力

import logging

logging.basicConfig(filename='error.log', level=logging.ERROR)

try:
    response = requests.get("https://api.example.com/data")
    response.raise_for_status()
except requests.RequestException as e:
    logging.error(f"エラーが発生しました: {e}")

例3:複数APIの並行処理とエラーハンドリング

from concurrent.futures import ThreadPoolExecutor

def fetch_data(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()
        return response.json()
    except requests.RequestException as e:
        print(f"エラーが発生しました: {e}")

with ThreadPoolExecutor() as executor:
    urls = ["https://api1.example.com/data", "https://api2.example.com/data"]
    results = list(executor.map(fetch_data, urls))

まとめ

適切なエラーハンドリングは、APIを安全かつ効率的に利用するために重要です。Pythonの`requests`ライブラリを使い、基本的なエラーハンドリングから高度な処理までを実装することが可能です。

コメント

コメントする

目次