1

私はpythonを勉強しようとしていて、サーバーのタイムアウトエラーをキャッチして(インターネット接続が中断された場合など)、プロセスをX秒間停止させるタイマーを追加したいと思っていました(以下のコードでは2 秒) その後、もう一度プロセスを続行してみてください。私の論理は正しいと思いますが (間違っている場合は訂正してください)、次のようなエラーが表示されます。

Exception in thread Thread-1:
Traceback (most recent call last):
  File "C:\Python33\lib\threading.py", line 639, in _bootstrap_inner
    self.run()
  File "C:\Python33\lib\threading.py", line 825, in run
    self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

タイマーがトリガーされてエラーになったように見える理由がよくわかりません。これが私のコードです:

import urllib.request
from threading import Timer

req = urllib.request.Request('http://www.nowebsitecontainsthisaddress.com')

def ServerTimeOut(e):
    timer_rest = Timer(2.0, print('Time Out Error:'))
    timer_rest.start()
    print (e.reason)

    while timer_rest.is_alive():
        pass


while True:

    try:
        url = urllib.request.urlopen(req)
        break
    except urllib.error.HTTPError as e:
        ServerTimeOut(e)
        req = urllib.request.Request('http://www.google.com')
    except urllib.error.URLError as e:
        ServerTimeOut(e)
        req = urllib.request.Request('http://www.google.com')

使用OSはwindows7です

更新: こんにちは。コードをこれに微調整してみましたが、エラーは返されなくなりました。エラーが発生した理由について誰かが私に教えてくれることを願っています..ありがとう^^、

import urllib.request
from threading import Timer

req = urllib.request.Request('http://www.nowebsitecontainsthisaddress.com')

def printMessage():
    print('Time Out Error:')

def ServerTimeOut(e):
    timer_rest = Timer(2.0, printMessage)
    timer_rest.start()

    print (e.reason)

    while timer_rest.is_alive():
        pass

while True:

    try:
        url = urllib.request.urlopen(req)
        break
    except urllib.error.HTTPError as e:
        ServerTimeOut(e)
        req = urllib.request.Request('http://www.google.com')
    except urllib.error.URLError as e:
        ServerTimeOut(e)
        req = urllib.request.Request('http://www.google.com')
4

1 に答える 1

1

Timer の作成時に print 関数を呼び出しています。タイマーを作成する正しい方法はTimer(2.0, print, 'Time Out Error').

于 2013-03-21T06:20:14.437 に答える