2013-04-05 4 views
3

Я получаю эту ошибку:Python HTTP 599: Соединение закрыто (Tornado)

HTTP 599: Connection closed [E 130405 11:43:14 web:1031] Uncaught exception GET /networks/1/sensors/1/alarm (127.0.0.1)

при выполнении следующего кода:

from tornado.stack_context import ExceptionStackContext 

def handle_exc(*args): 
print('Exception occured') 
return True 

@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 is not None: 
      print("Terzo") 
      print response.error 
      with ExceptionStackContext(handle_exc): 
       response.rethrow() 
    else: 
     print('Handle request') 

    for line in response.body.split("\n"): 
       if line != "": 
        #net = int(line.split(" ")[1]) 
        #sens = int(line.split(" ")[2]) 
        #stype = int(line.split(" ")[3]) 
        value = int(line.split(" ")[4]) 
        print value 
        yield value 
        return 


class AlarmHandler(BaseHandler): 
    @tornado.web.authenticated 
    @tornado.web.asynchronous 
    @tornado.gen.engine 
    def get(self, netid, sensid): 
     self.lock_tables("read", ['devices']) 
     status = self.db.get("SELECT status from devices \ 
          WHERE id=%s AND network_id=%s", sensid, netid) 
     print("Primo") 
     print status 

     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 
     if value != status['status']: 

      self.lock_tables("write", ['devices']) 
      self.db.execute("UPDATE devices SET status=%s \ 
          WHERE id=%s AND network_id=%s", value, netid, sensid) 
      self.unlock_tables() 
      self.notice("Status changed") 

В классе AlarmHandler есть периодическая процедура называется check_status_changes , В этой функции я получаю ошибку заголовка, когда есть response.error.

Как установить условие ошибки, чтобы вернуться в класс и управлять ситуацией? Спасибо.

ДРУГИЕ INFORMATIONS

Если я делаю экран Tornado, я вижу это:

Primo

{'status': None}

Secondo

None

Terzo

HTTP 599: Connection closed

Exception occured

так, я думаю, что программа закрывает соединение перед тем исключением является rethtow!

И в HTML Пульт Я вижу эту ошибку:

File "./wsn.py", line 226, in check_status_changes for line in response.body.split("\n"): AttributeError: 'NoneType' object has no attribute 'split'

ответ

0

вы поднимаете исключение:

if response.error: 
     print("Terzo") 
     print response.error 
     raise Exception(response.error) 
     return 

Это будет Uncaught Exception. Вы должны закодировать это, чтобы обрабатывать исключение, не создавая исключения. Например. запишите сообщение об ошибке и прервите обновление базы данных.

+1

Ok MattH Я попробовал с этим решением http://stackoverflow.com/a/7623570/1353274 вы даете мне в чате python. Я пробовал, но ошибка такая же ... Поиск в Интернете Я видел, что есть похожая ошибка в старой версии Tornado ... может быть, моя проблема? Как я могу получить версию Tornado? Однако я редактирую вопрос с вашим решением. – sharkbait