この記事では、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`ライブラリを使い、基本的なエラーハンドリングから高度な処理までを実装することが可能です。
コメント