2013-02-06 2 views
2

Je suis nouveau chez python, actuellement je travaille sur un tracker GPS avec qui interagit avec Google maps en utilisant un Arduino Uno. Je reçois cette erreur et il ne me laisse pas exécuter le script .py pour mon tcpServer c'est le script entier.NameError: nom global 'message' n'est pas défini

#!/Usr/bin/env python

import socket 
import MySQLdb 

TCP_IP = 'my machine IP' 
TCP_PORT = 32000 
BUFFER_SIZE = 40 

# ClearDB. Deletes the entire tracking table 

def ClearDB(curs,d): 
    curs.execute (""" 
     INSERT INTO gmaptracker (lat, lon) 
     VALUES (0.0,0.0)""") 
    d.commit() 

# Connect to the mySQL Database 

def tServer(): 
    try: 

     db = MySQLdb.connect (host = "my host", 
      user = "my user", 
      passwd = "my password", 
      db = "gmap") 
    except MySQLdb.Error, e: 
     print "Error %d: %s" %(e.args[0], e.args[1]) 
     sys.exit(1); 

    cursor = db.cursor() 

    # Start with a fresh tracking table 

    ClearDB(cursor,db) 

    # Set up listening Socket 

    try: 
     s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
     s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
     s.bind((TCP_IP, TCP_PORT)) 
     print "Listening...." 
     s.listen(1) 
     conn, addr = s.accept() 
     print 'Accepted connection from address:', addr 

    except socket.error (message): 
     if s: 
      s.close() 
      print "Could not open socket: " + message 
      cursor.close() 
      conn.close() 
      db.close() 
      sys.exit(1) 

    try: 
     while 1: 
      data = conn.recv(BUFFER_SIZE) 
      if not data:break 

      str1,str2 = data.split("Long: ") 
      str1 = str1.split("Lat: ")[1] 
      latitude = float(str1) 
      longitude = float(str2) 
      cursor.execute (""" 
       INSERT INTO gmaptracker (lat, lon) 
       VALUES (%s,%s)""", (latitude,longitude)) 

      db.commit() 

    except KeyboardInterrupt: 
     ClearDB(cursor,db); 
     cursor.close() 
     conn.close() 
     db.close() 

if __name__ == '__main__': 
    tServer() 

et ceci est l'erreur que je reçois

Traceback (most recent call last): 
File "tcpServer.py", line 79, in <module> 
    tServer() 
File "tcpServer.py", line 48, in tServer 
    except socket.error(message): 
NameError: global name 'message' is not defined 

Si quelqu'un peut me aider à ceci, je serais très heureux, comme je l'ai dit je suis nouveau chez Python, je cours aussi python 2.7 si cela aide. Merci d'avance

Répondre

2

Vous n'utilisez pas la syntaxe correcte pour intercepter une exception. , Utilisez plutôt:

except socket.error as serror: 
    message = serror.message 

L'exception socket.error a deux attributs supplémentaires, errno et message. ancien code utilisé pour la capture comme ceci:

except socket.error, (value, message): 

car en Python 2, vous pouvez traiter une exception comme un tuple et déballer, mais qui est allé en Python 3 et ne devrait vraiment pas être utilisé.

De plus, l'ancienne except exceptiontype, targetvariable: a été remplacée par la syntaxe except exceptiontype as targetvariable: car elle est moins ambiguë lorsque vous essayez d'intercepter plus d'un type d'exception dans la même instruction.

Lorsqu'une exception est levée, le flux normal de code est interrompu; à la place, le flux «saute» au gestionnaire d'exceptions. En raison de ce saut, vous avez un autre problème dans votre code. Dans le gestionnaire d'exception, vous faites référence à conn.close(), mais la variable conn est définie après le point où l'exception de socket sera lancée (les différentes opérations de socket). Cela se traduira par un NameError. Dans ce cas, il y a aucun chemin à travers votre code qui se traduira par conn étant attribué une connexion socket ouvert, vous pouvez supprimer la ligne conn.close() tout à fait.

Si était nécessaire d'appeler .close() sur conn, vous auriez besoin de détecter si elle a été créée en premier lieu. Réglez-le à None, au préalable, puis appelez .close() que si conn n'est plus None:

conn = None 
try: 
    # ... do stuff ... 
    conn, addr = s.accept() 
    # ... do more stuff 
except socket.error as serror: 
    # test if `conn` was set 
    if conn is not None: 
     conn.close() 
+0

Merci qui a aidé mais maintenant je reçois ce: retraçage (appel le plus récent en dernier): Fichier « tcpServer.py », line80 , dans tServer() Fichier "tcpServer.py", ligne 54, dans tServer conn.close() –

+0

Vous essayez de fermer 'conn', mais le fichier' socket.error' est lancé * avant * que cette variable soit définie. –

+0

mais la variable est définie avant l'exception ... –

Questions connexes