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

在python套接字中处理超时错误,python,sockets,exception,error-handling,Python,Sockets,Exception,Error Handling,我试图找出如何使用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',

我试图找出如何使用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模块的方式是导入所有内容,但我如何处理文档中的异常?它说您可以使用socket.timeouterror,但这对我不起作用。另外,如果我导入了套接字,我将如何编写try异常块?有人能解释一下进口的区别吗

当您从套接字导入执行
操作时*
python正在将
socket
模块加载到当前名称空间。因此,您可以使用模块的成员,就好像它们是在当前python模块中定义的一样

当您执行导入套接字时,模块将加载到单独的命名空间中。访问其成员时,应在其前面加上模块名。例如,如果要引用一个
socket
类,则需要编写
client\u socket=socket.socket(socket.AF\u INET,socket.SOCK\u DGRAM)

至于超时的问题-您所需要做的就是将
除了套接字。Timeouterror:
更改为
除了超时:
,因为
超时
类是在
套接字
模块中定义的,并且您已经将其所有成员导入了命名空间

from foo import * 
foo
中不带前导下划线的所有名称(或仅在modules
\uuuuu all\uuuuu
属性中定义的名称)添加到当前模块中

在上面的代码中,当您将
timeout
拉入当前名称空间时,您只想捕获
timeout

fromsocketimport*
引入了
socket
内部所有内容的定义,但没有添加
socket
本身

try:
    # socketstuff
except timeout:
    print 'caught a timeout'
许多人认为<代码>导入*>代码>有问题,并试图避免它。这是因为以这种方式导入的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

只需再输入一点点,但所有内容都是明确的,读者很清楚所有内容的来源。

以下是我在一个项目中使用的解决方案

network\u utils.telnet
测验
我取得了足够的成功,只捕获了
socket.timeout
socket.error
;尽管socket.error可能会因为很多原因而引发。小心点

import socket
import logging

hostname='google.com'
port=443

try:
    sock = socket.create_connection((hostname, port), timeout=3)

except socket.timeout as err:
    logging.error(err)

except socket.error as err:
    logging.error(err)

我想你是指
socket.timeout
而不是
socket.Timeouterror
def test_telnet_is_null_when_host_unreachable(self):
    hostname = 'unreachable'

    response = network_utils.telnet(hostname)

    self.assertDictEqual(response, {'unreachable': None})

def test_telnet_give_time_when_reachable(self):
    hostname = '127.0.0.1'

    response = network_utils.telnet(hostname, port=22)

    self.assertGreater(response[hostname], 0)
import socket
import logging

hostname='google.com'
port=443

try:
    sock = socket.create_connection((hostname, port), timeout=3)

except socket.timeout as err:
    logging.error(err)

except socket.error as err:
    logging.error(err)