App Engine的urlfetch在我认为不该异常时抛出异常

3 投票
1 回答
2356 浏览
提问于 2025-04-15 18:17

我写了我的第一个Python应用程序,使用了App Engine的API,目的是监控一系列服务器,并在其中一台服务器出现故障时通知我。通知方式可以是通过Prowl给我的iPhone发送消息,或者发邮件,或者两者都可以。

问题是,每周有几次,它会通知我某台服务器宕机,尽管那台服务器明显是正常的。我测试了一些我知道几乎一直在线的服务器,比如google.com或amazon.com,但我也收到了它们宕机的通知。

我在http://aeservmon.appspot.com上运行了一份代码,你可以看到google.com是在1月3日添加的,但它只显示正常运行了6天。

下面是checkservers.py中与urlfetch相关的代码部分,我原以为只有在无法联系到服务器时才会抛出DownloadError异常,但也许我错了。

我漏掉了什么呢?

完整的源代码在github上,用户名是mrsteveman1/aeservmon(作为新用户我只能发一个链接,抱歉!)

def testserver(self,server):
     if server.ssl:
          prefix = "https://"
     else:
          prefix = "http://"
     try:
          url = prefix + "%s" % server.serverdomain
          result = urlfetch.fetch(url, headers = {'Cache-Control' : 'max-age=30'} )
     except DownloadError:
          logging.info('%s could not be reached' % server.serverdomain)
          self.serverisdown(server,000)
          return
     if result.status_code == 500:
          logging.info('%s returned 500' % server.serverdomain)
          self.serverisdown(server,result.status_code)
     else:
          logging.info('%s is up, status code %s' % (server.serverdomain,result.status_code))
          self.serverisup(server,result.status_code)

更新1月21日:

今天我在日志中发现了一个异常:

ApplicationError: 5 
Traceback (most recent call last):
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/aeservmon/1.339312180538855414/checkservers.py", line 149, in get
    self.testserver(server)
  File "/base/data/home/apps/aeservmon/1.339312180538855414/checkservers.py", line 106, in testserver
    result = urlfetch.fetch(url, headers = {'Cache-Control' : 'max-age=30'} )
  File "/base/python_lib/versions/1/google/appengine/api/urlfetch.py", line 241, in fetch
    return rpc.get_result()
  File "/base/python_lib/versions/1/google/appengine/api/apiproxy_stub_map.py", line 501, in get_result
    return self.__get_result_hook(self)
  File "/base/python_lib/versions/1/google/appengine/api/urlfetch.py", line 331, in _get_fetch_result
    raise DownloadError(str(err))
DownloadError: ApplicationError: 5 

1 个回答

2

其他人也在报告关于fetch服务的问题(例如:http://code.google.com/p/googleappengine/issues/detail?id=1902&q=urlfetch&colspec=ID%20Type%20Status%20Priority%20Stars%20Owner%20Summary%20Log%20Component

你能打印出异常信息吗?这样可能会有更多的细节,比如:

"DownloadError: ApplicationError: 2 something bad"

撰写回答