4

sixohsix の Twitter Wrapper for Pythonを使用して、API からツイートを繰り返し (1 時間ごとに) フェッチする小さなスクリプトがあります。Twitter API から発生するすべてのエラー、つまりすべての 5xx および 4xx のものではないにしても、ほとんどの処理に成功しています。

それにもかかわらず、以下のエラー トレースバックをランダムに観察します (2 ~ 3 日に 1 回のみ)。つまり、プログラムが終了し、トレースバックがシェルに表示されます。これが何を意味するのかはわかりませんが、ほとんどの場合正しく実行されることが証明されているため、スクリプトの動作とは直接関係がないと思います。

これは、スクリプトでラッパーの関数を呼び出す場所です。

KW = {
        'count': 200, # number of tweets to fetch (fetch maximum)
        'user_id' : tweeter['user_id'],
        'include_rts': 'false', # do not include native RT's 
        'trim_user' : 'true', 
     }
     timeline = tw.twitter_request(tw_endpoint,\
         tw_endpoint.statuses.user_timeline, KW)

この関数tw.twitter_request(tw_endpoint, tw_endpoint.statuses.user_timeline, KW)は基本的に を実行しreturn tw_endpoint.statuses_user_timeline(**args)、ここで にargs変換されKWtw_endpointsixohsix のライブラリの使用から取得された OAuthorized エンドポイントです

return twitter.Twitter(domain='api.twitter.com', api_version='1.1',
                    auth=twitter.oauth.OAuth(access_token, access_token_secret,
                    consumer_key, consumer_secret))

これはトレースバックです:

Traceback (most recent call last):
  File "search_twitter_entities.py", line 166, in <module>
    tw_endpoint.statuses.user_timeline, KW)
  File "/home/tg/mild/twitter_utils.py", line 171, in twitter_request
    return twitter_function(**args)
  File "build/bdist.linux-x86_64/egg/twitter/api.py", line 173, in __call__
  File "build/bdist.linux-x86_64/egg/twitter/api.py", line 177, in _handle_response
  File "/usr/lib/python2.7/urllib2.py", line 126, in urlopen
    return _opener.open(url, data, timeout)
  File "/usr/lib/python2.7/urllib2.py", line 400, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 418, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 1215, in https_open
    return self.do_open(httplib.HTTPSConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1180, in do_open
    r = h.getresponse(buffering=True)
  File "/usr/lib/python2.7/httplib.py", line 1030, in getresponse
    response.begin()
  File "/usr/lib/python2.7/httplib.py", line 407, in begin
    version, status, reason = self._read_status()
  File "/usr/lib/python2.7/httplib.py", line 371, in _read_status
    raise BadStatusLine(line)
httplib.BadStatusLine: ''

そのトレースバックから得られる唯一のことは、エラーが別の Python ライブラリの奥深くで発生し、Twitter API またはラッパーからの無効な HTTP 統計に関係しているということです...しかし、私が言ったように、おそらくあなたの一部はこれをデバッグ/解決する方法についてのヒントを得ることができます。スクリプトを定期的にチェックして再起動し、ツイートを取得し続ける必要があるのはかなり面倒だからです。

EDIT : これを少し明確にするために、トレースバックの最初の 2 つの関数は、既に try-except ブロックにあります。たとえば、ファイル "twitter_utils.py" の try-except-Block は、40x および 50x の例外を除外しますが、except:. 私が理解していないのは、エラーがこの位置でキャッチされず、代わりにプログラムが強制終了され、トレースバックが出力される理由です。簡単に言えば、PHP スクリプトの解析エラーのように、エラーをキャッチできない状況にあります。では、どうすればよいでしょうか?

4

1 に答える 1

0

おそらく、これはあなたを正しい方向に向けるでしょう。これは、BadStatusLine が呼び出されたときに呼び出されるものです。

class BadStatusLine(HTTPException):
    def __init__(self, line):
        if not line:
            line = repr(line)
        self.args = line,
        self.line = line

私は httplib にあまり詳しくありませんが、推測する必要がある場合は、空の応答/エラー行が表示され、解析できません。プログラムが停止している行の前にコメントがあります。

    # Presumably, the server closed the connection before
    # sending a valid response.
    raise BadStatusLine(line)

Twitter が応答を送信する前に接続を閉じている場合は、もう一度試すことができます。つまり、「search_twitter_entities.py」の 166 行目で数回 (醜い) try/except を実行します。

try:
     timeline = tw.twitter_request(tw_endpoint,\
              tw_endpoint.statuses.user_timeline, KW)
except:
     try:
          timeline = tw.twitter_request(tw_endpoint,\
                   tw_endpoint.statuses.user_timeline, KW) # try again
     except:
          pass 

または、毎回タイムラインを none として再割り当てできると仮定して、while ループを実行します。

timeline = None
while timeline == None:
     try:
          timeline = tw.twitter_request(tw_endpoint,\
              tw_endpoint.statuses.user_timeline, KW)
     except:
          pass

私はそれをテストしませんでした。悪いコードをチェックします。

于 2013-01-25T04:20:44.027 に答える