2013-02-06 134 views
2

我是python新手,目前我正在開發一款GPS跟蹤器,並使用Arduino Uno與Google地圖進行交互。我得到這個錯誤,它不讓我爲我的tcpServer運行.py腳本,這是整個腳本。NameError:未定義全局名稱'message'

#!的/ usr /斌/包膜蟒蛇

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

,這是我得到

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 

如果有人可以幫助我弄清楚了這一點,我將不勝感激錯誤,正如我所說我是新的python我也運行python 2.7如果有幫助。在此先感謝

回答

2

您沒有使用正確的語法來捕獲異常。相反,使用:

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

socket.error異常有兩個額外的屬性,errnomessage。用來捕捉像這樣的老代碼:

except socket.error, (value, message): 

因爲在Python 2,你可以像對待一個元組的異常並解壓,但走了在Python 3其實它不應該使用。

此外,舊的except exceptiontype, targetvariable:已被替換爲except exceptiontype as targetvariable:語法,因爲當您嘗試在同一語句中捕獲多個異常類型時,該語法不太明確。

當拋出異常時,正常的代碼流被中斷;而是流'跳轉到異常處理程序。由於這個跳躍,你的代碼中有另一個問題。在異常處理程序中,您指的是conn.close(),但變量conn在之後的位置被定義爲,其中將引發套接字異常(各種套接字操作)。這將導致NameError。在這種情況下,有沒有路徑通過您的代碼將導致conn分配一個開放的套接字連接,您可以完全刪除conn.close()行。

如果有需要調用.close()conn,你需要的,如果它是在第一位置設置檢測。其設置爲None,事前,然後調用.close()只有conn不再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

感謝那些幫助,但現在我得到這樣的:回溯(最後最近一次調用):文件「tcpServer.py」,line80 ,在 tServer()文件「tcpServer.py」,第54行,在tServer中conn.close() –

+0

您試圖關閉'conn',但是在設置變量之前拋出了'socket.error'。 –

+0

,但變量之前設置除... –

相關問題