小编典典

处理python套接字中的超时错误

python

我试图弄清楚如何使用try和except处理套接字超时。

from socket import *

def main():
    client_socket = socket(AF_INET,SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message',(server_host,server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.Timeouterror:
            #more code

我添加套接字模块的方法是导入所有内容,但是我如何处理文档中的异常,该异常表明您可以使用socket.timeouterror,但这对我不起作用。另外,如果这样做,我将如何编写try异常块import socket?有人可以解释进口的差异吗?


阅读 127

收藏
2020-12-20

共1个答案

小编典典

from foo import *

将所有不带下划线的名称(或仅在modules__all__属性中定义的名称)添加foo到当前模块中。

在上面的代码中,from socket import *您只是想抓住timeouttimeout进入当前名称空间的时间。

from socket import *提取内部所有内容的定义,socket但不添加socket自身。

try:
    # socketstuff
except timeout:
    print 'caught a timeout'

许多人认为import *有问题,并设法避免它。这是因为在以这种方式导入的2个或更多模块中的公用变量名称将相互破坏。

例如,考虑以下三个python文件:

# a.py
def foo():
    print "this is a's foo function"

# b.py
def foo():
    print "this is b's foo function"

# yourcode.py
from a import *
from b import *
foo()

如果运行,yourcode.py您将只看到输出“ this is b’s foo function”。

因此,我建议要么导入并使用模块,要么从模块中导入特定名称:

例如,带有显式导入的代码如下所示:

import socket
from socket import AF_INET, SOCK_DGRAM

def main():
    client_socket = socket.socket(AF_INET, SOCK_DGRAM)
    client_socket.settimeout(1)
    server_host = 'localhost'
    server_port = 1234
    while(True):
        client_socket.sendto('Message', (server_host, server_port))
        try:
            reply, server_address_info = client_socket.recvfrom(1024)
            print reply
        except socket.timeout:
            #more code

只是增加了一点点输入,但所有内容都是明确的,并且对于所有来源的读者来说都是显而易见的。

2020-12-20