2013-04-05 10 views
3

Je reçois cette erreur:Python HTTP 599: Connexion fermée (Tornado)

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

tout en exécutant le code suivant:

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") 

Dans la classe AlarmHandler il y a une routine périodique appelé check_status_changes . Dans cette fonction, j'obtiens l'erreur du titre quand il y a un response.error.

Comment puis-je définir si la condition d'erreur pour retourner à la classe et gérer la situation? Je vous remercie.

AUTRES INFORMATIONS

Si je fais un écran de Tornado, je vois ceci:

Primo

{'status': None}

Secondo

None

Terzo

HTTP 599: Connection closed

Exception occured

, je pense que le programme fermer la connexion avant que l'exception est rethtow!

Et dans la consolle html je vois cette erreur:

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

Répondre

0

Vous élevez une exception:

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

Ce sera une Uncaught Exception. Vous devriez coder ceci pour gérer l'exception sans lever une exception. Par exemple. consigner le message d'erreur et abandonner la mise à jour de la base de données.

+1

Ok MattH J'ai essayé avec cette solution http://stackoverflow.com/a/7623570/1353274 que vous me donnez dans le chat en python. J'ai essayé mais l'erreur c'est pareil ... En cherchant sur Internet j'ai vu qu'il y a un bug similaire dans une ancienne version de Tornado ... pourrait être mon problème? Comment puis-je obtenir ma version Tornado? Je modifie cependant la question avec votre solution. – sharkbait

Questions connexes