【问题标题】:Python Except 'socket' object has no attribute 'error'Python除了'socket'对象没有属性'error'
【发布时间】:2020-05-12 12:35:43
【问题描述】:

我正在为 Python 3.8 中的 TCP 服务器编写测试脚本。

脚本运行良好,但现在我正在尝试实现更有效的错误捕获以识别超时错误。

为此,我开始捕获套接字连接的错误和超时错误。

这是我的 SocketConnect 函数:

def SocketConnect( host, port ):
    global socketHandle

    opResult = errorMessagesToCodes['No Error']

    # Set Socket Timeout
    socketHandle.settimeout(1)
    logging.debug("Connect")
    try:
        socketHandle.connect((host, port))
    except socketHandle.error as e:
        opResult = errorMessagesToCodes['Socket Error']
        logging.error("!!! Socket Connect FAILED: %s" % e)

    return opResult

套接字处理程序有效,为了测试超时,我禁用了服务器。

连接后一秒钟后,代码转到 except 但我收到此错误:

socket.connect((主机,端口))

socket.timeout:超时

在处理上述异常的过程中,又发生了一个异常:

除了 socket.error as e: AttributeError: 'socket' 对象没有属性 'error'

有什么遗漏吗?

因为我不明白为什么套接字对象没有属性错误。我认为这是套接字接口的标准错误。

提前感谢您的帮助。

更新: 我试图做一个基本的测试(从一个空白项目开始):只有一个套接字创建和一个套接字连接(服务器不处于监听模式)来模拟超时。

这是代码:

import socket
import logging

try:
    socketHandle = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socketHandle.error as e:
    logging.error("Socket Create FAILED: %s" % e)

socketHandle.settimeout(1)

try:
    socketHandle.connect(('localhost', 2000))
except socketHandle.error as e:
    logging.error("!!! Socket Connect FAILED: %s" % e)

连接超时,但我仍然收到错误:

除了 socketHandle.error as e: AttributeError: 'socket' 对象没有属性 'error'

我真的不知道发生了什么。

更新 2:

我做了一些其他测试,如果我在 connect 函数中使用 try-catch,我会收到错误,但如果我在 main 中使用 try-catch,则不会出现任何错误。

最好的问候, 费德里科

【问题讨论】:

    标签: python sockets


    【解决方案1】:

    这个错误是由于你重新定义了模块名称socket;这就是包含socket.error 的内容。您正在尝试从套接字对象访问模块级常量(在本例中为来自套接字模块的 error)。您还可以收紧错误处理以仅捕获超时。无论如何这可能是需要的,因为看起来socket.error 不包括socket.timeout。更改您的套接字名称应该可以解决问题:

    def SocketConnect(socx, host, port ):
        opResult = errorMessagesToCodes['No Error']
    
        # Set Socket Timeout
        socx.settimeout(1)
        logging.debug("Connect")
        try:
            socx.connect((host, port))
        except socket.timeout as e:
            opResult = errorMessagesToCodes['Socket Error']
            logging.error("!!! Socket Connect FAILED: %s" % e)
    
        return opResult
    

    【讨论】:

    • 嗨罗伯特,我按照你的建议更改了代码,但我得到了同样的错误。谢谢
    • 您可能在全局级别定义了一个套接字对象,您可以分享您的整个代码吗?
    • 没错,我试图定义一个全局套接字处理程序,以便在代码与模块“atexit”崩溃时关闭套接字。我无法共享代码。对不起
    • 那是您的问题,您不能重命名套接字模块并期望访问其成员。要么更改套接字的名称(如上例所示),使用上下文管理器或 try/except 块而不是 atexit,或者将套接字导入为其他内容
    • 有没有办法全局共享套接字句柄?我来自 C 语言..所以我的 python 技能不是最好的:)
    猜你喜欢
    • 2013-05-02
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多