Python BadYieldError: дали неизвестный объект HTTPError ('HTTP 599: Соединение закрыто',)

2013-04-04 1 views
3

Я хочу знать, почему в этой функции:Python BadYieldError: дали неизвестный объект HTTPError ('HTTP 599: Соединение закрыто',)

@tornado.gen.engine 
def check_status_changes(netid, sensid): 

    como_url = "".join(['http://131.114.52:44444/ztc?netid=', str(netid), \ 
       '&sensid=', str(sensid), '&start=-5s&end=-1s']) 

    http_client = AsyncHTTPClient() 
    response = yield tornado.gen.Task(http_client.fetch, como_url) 

    if response.error: 
     raise Exception(response.error) 

когда есть response.error, я получаю ошибку в заголовке ... что я должен уступить, чтобы поймать возвращаемое значение в другой функции?

Я бы после того, как сделать что-то вроде:

try: 
     periodic = tornado.ioloop.PeriodicCallback(check_status_changes(netid, sensid), 5000) 
     value = periodic.start() 
     print("Secondo") 
     print value 
    except: 
     print("Quarto") 
     periodic.stop() 
     self.finish() 
     return 
    else: 

Я не знаю ... Я бы просто сравнить возвращаемое значение с другой ....

Спасибо.

+2

Почему бы не сделать исключение вместо этого? Затем обрабатывайте исключение отдельно у потребителя этого генератора. –

+0

Как я могу это сделать? Я не могу создать исключение Bad Yield ... – sharkbait

+0

Создайте собственное исключение? Вы можете поднять * любое исключение *, которое вам нравится. –

ответ

4

Эта функция имеет декоратор gen.engine, вы не можете вернуть значение изнутри (не связанное с торнадо, вы не можете вернуть значение внутри генератора).

Если вы пытаетесь получить значение из этой функции -provided вы вызываете, что на IOLoop-, что функция должна иметь callback (вызываемый) ключевое слово аргумента как таковые:

@tornado.gen.engine 
def check_status_changes(netid, sensid, callback=None): 
    response = yield tornado.gen.Task(do_your_thing) 
    if response.error: 
     raise response.error 
    callback(response.body) # this is how you make the value available to the 
          # caller; response.body is HTTPResponse specific iirc 

Теперь вы можете вызвать эту функцию в другом месте, как, например:

# somewhere in a gen.engine decorated async method 
body = yield tornado.gen.Task(check_status_changes, netid, sensid) 
+0

Да, но если вы видите вторую часть кода, я бы назвал check_status_changes в периодическом обратном вызове.Как я могу это сделать? Ваше решение хорошее. Сделайте звонок периодическим! Благодаря!!!! – sharkbait

3

Вы можете использовать

raise tornado.gen.Return(response) 
0
class MainHandler(tornado.web.RequestHandler): 
     @gen.coroutine 
     def get(self): 
      http_client = AsyncHTTPClient() 
      http_client = tornado.httpclient.AsyncHTTPClient() 
      response = yield http_client.fetch('http://localhost:1338/api/getDistinctGeoPositions/?durationInMinutes=9000') 
      if response.error: 
       print response.error 
      self.finish(response.body) 
Смежные вопросы