読者です 読者をやめる 読者になる 読者になる

httplib2.Httpでtimeoutを指定した場合のエラー処理

Python

httplib2でタイムアウトを指定するには、

import httplib2
client = httplib2.Http(timeout=5)
client.request("http://example.com/")

のようにhttplib2.Httpの引数でtimeoutを指定する。

デフォルトではリクエストがタイムアウトするとsocket.timeout例外になる。なので、例外を適切に処理するには、

import httplib2
import socket

try:
    client = httplib2.Http(timeout=5)
    headers, content = client.request("http://example.com/")
except socket.timeout, e:
    # do something
    pass

のように書かないといけない。せっかくhttplib2を使っているのに、"import socket"と書くのはスマートじゃないなぁという場合、httplib2.Http.force_exception_to_status_codeを真に設定する。こうすると、タイムアウトした場合、レスポンスのステータスがHTTP 408(Request Timeout)となり、例外は発生しない。

# -*- coding: utf-8 -*-
import httplib2

client = httplib2.Http(cache='/tmp', timeout=5)
client.force_exception_to_status_code = True
headers, content = client.request("http://example.com/")
status = headers.get("status")
if status in ("200", "304"):
  # 正常時の処理
  pass
elif status in ("408"):
  # タイムアウトした場合の処理
  pass
else:
  # 以下省略
  pass

c.f.