我正在尝试弄清楚如何使用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,但这对我不起作用。另外,如果我使用import socket
,我将如何编写try异常块呢?有没有人能解释一下进口的区别。
发布于 2012-08-08 21:50:16
from foo import *
将foo
中不带前导下划线的所有名称(或仅在模块__all__
属性中定义的名称)添加到当前模块中。
在上面使用from socket import *
的代码中,您只是想捕获timeout
,因为您已经将timeout
放入了当前的名称空间。
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‘see 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
只是多了一点打字,但一切都很明确,对读者来说,一切都是从哪里来的。
发布于 2016-09-21 03:12:36
我已经取得了足够的成功,只需要抓取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)
发布于 2012-08-08 21:50:02
当您执行此操作时,from socket import *
会将一个socket
模块加载到当前名称空间。因此,您可以使用模块的成员,就好像它们是在当前的python模块中定义的一样。
执行import socket
时,模块被加载到单独的名称空间中。当您访问它的成员时,您应该在它们前面加上一个模块名称。例如,如果要引用socket
类,则需要编写client_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
。
至于超时的问题-你所需要做的就是将except socket.Timeouterror:
改为except timeout:
,因为timeout
类是在socket
模块中定义的,并且你已经将它的所有成员导入到了你的命名空间中。
https://stackoverflow.com/questions/11865685
复制相似问题