python - 名称错误 : global name 'message' is not defined

标签 python mysql python-2.7 gps gprs

我是 Python 新手,目前我正在开发一个 GPS 跟踪器,它使用 Arduino Uno 与 Google map 交互。我收到此错误,它不允许我为我的 tcpServer 运行 .py 脚本,这是整个脚本。

#!/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()

这是我遇到的错误

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。提前致谢

最佳答案

您没有使用正确的语法来捕获异常。相反,使用:

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: 语法取代,因为当您 try catch 多个时,该语法不再那么模糊。同一语句中的异常类型。

当抛出异常时,正常的代码流程被中断;相反,流程“跳转”到异常处理程序。由于这个跳转,您的代码中存在另一个问题。在异常处理程序中,您引用 conn.close(),但变量 conn 是在抛出套接字异常的之后定义的(各种套接字操作)。这将导致 NameError。在这种情况下,您的代码没有路径会导致 conn 被分配一个打开的套接字连接,您可以删除 conn.close() 一行。

如果需要conn上调用.close(),您需要检测它是否在第一名。预先将其设置为 None,然后仅当 conn 不再是 None 时才调用 .close():

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

关于python - 名称错误 : global name 'message' is not defined,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14719359/

相关文章:

python - Airflow 中的辅助功能

python - 如何在 Python OpenPyXL 中更改字体大小

python - 使用 Flask 和 render_template 显示 HTML 表格

python - 函数参数类型设置返回 SyntaxError

python - 如何在 python 中与终端交互

php - 什么是更快的平面文件或 MySQL RAM 数据库?

mysql - 数据库名称作为 MySQL 查询中的变量

php - 在顶部和其他之后获得特定的 id

python - 在 Alpine Linux 上安装 Pillow 时没有这样的文件或目录 "limits.h"

python文件复制给出更大的文件