1

これが私のコードです(@cdhowieのほぼ完全なバージョン:)):

def getResult(method, argument=None):
  result = None

  while True:
    print('### loop')
    try:
      print ('### try hard...')
      if argument:
        result = method(argument)
      else:
        result = method()
      break
    except Exception as e:
      print('### GithubException')
      if 403 == e.status:
        print('Warning: ' + str(e.data))
        print('I will try again after 10 minutes...')
      else:
        raise e

  return result

def getUsernames(locations, gh):
  usernames = set()

  for location in locations:
    print location
    result = getResult(gh.legacy_search_users, location)
    for user in result:
      usernames.add(user.login)
      print user.login,

  return usernames

# "main.py"
gh = Github()
locations = ['Washington', 'Berlin']
# "main.py", line 12 is bellow
usernames = getUsernames(locations, gh)

問題は、その例外が発生することですが、私はそれを処理できません。出力は次のとおりです。

### loop
### try hard...
Traceback (most recent call last):
  File "main.py", line 12, in <module>
    usernames = getUsernames(locations, gh)
  File "/home/ciembor/projekty/github-rank/functions.py", line 39, in getUsernames
    for user in result:
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/PaginatedList.py", line 33, in __iter__
    newElements = self.__grow()
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/PaginatedList.py", line 45, in __grow
    newElements = self._fetchNextPage()
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/Legacy.py", line 37, in _fetchNextPage
    return self.get_page(page)
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/Legacy.py", line 48, in get_page
    None
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/Requester.py", line 69, in requestAndCheck
    raise GithubException.GithubException(status, output)
github.GithubException.GithubException: 403 {u'message': u'API Rate Limit Exceeded for 11.11.11.11'}

なぜ印刷されないの### handling exceptionですか?

4

1 に答える 1

6

例外のスタック トレースをよく見てください。

Traceback (most recent call last):
  File "main.py", line 12, in <module>
    usernames = getUsernames(locations, gh)
  File "/home/ciembor/projekty/github-rank/functions.py", line 39, in getUsernames
    for user in result:
  File "/usr/lib/python2.7/site-packages/PyGithub-1.8.0-py2.7.egg/github/PaginatedList.py", line 33, in __iter__
    newElements = self.__grow()
  ...

for user in result: 実行が終了した後 、行によって呼び出されているコードから例外がスローされていますgetResult。これは、使用している API が遅延評価を使用していることを意味するため、実際の API リクエストは期待どおりに行われません。

この例外をキャッチして処理するには、getUsernames関数内のコードをtry/exceptハンドラーでラップする必要があります。

于 2012-10-17T18:56:08.657 に答える