web-dev-qa-db-ja.com

urllib2のタイムアウトを処理しますか? -Python

Urllib2のurlopen内でタイムアウトパラメーターを使用しています。

urllib2.urlopen('http://www.example.org', timeout=1)

Pythonタイムアウトの期限が切れると、カスタムエラーが発生するはずだと言うにはどうすればよいですか?


何か案は?

62
RadiantHex

except:を使用したい場合はほとんどありません。これを行うと、デバッグが困難になる可能性のあるany例外をキャプチャし、SystemExitおよびKeyboardInteruptなどの例外をキャプチャします。これにより、プログラムを使用するのが面倒になります。

最も簡単な場合、 urllib2.URLError をキャッチします。

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError, e:
    raise MyException("There was an error: %r" % e)

以下は、接続がタイムアウトしたときに発生する特定のエラーをキャプチャする必要があります。

import urllib2
import socket

class MyException(Exception):
    pass

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError, e:
    # For Python 2.6
    if isinstance(e.reason, socket.timeout):
        raise MyException("There was an error: %r" % e)
    else:
        # reraise the original error
        raise
except socket.timeout, e:
    # For Python 2.7
    raise MyException("There was an error: %r" % e)
99
dbr

In Python 2.7.3:

import urllib2
import socket

class MyException(Exception):
    pass

try:
    urllib2.urlopen("http://example.com", timeout = 1)
except urllib2.URLError as e:
    print type(e)    #not catch
except socket.timeout as e:
    print type(e)    #catched
    raise MyException("There was an error: %r" % e)
19
eshizhan