我正在尝试弄清楚如何使用 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,但这对我不起作用。另外,如果我执行了 import socket
,我将如何编写 try 异常 block ?进口有什么区别?
最佳答案
from foo import *
将 foo
中不带前导下划线的所有名称(或仅在模块 __all__
属性中定义的名称)添加到当前模块中。
在上面带有 from socket import *
的代码中,您只想在将 timeout
拉入当前命名空间时捕获 timeout
.
from socket import *
引入 socket
内所有内容的定义,但它不添加 socket
本身。
try:
# Socket stuff
except timeout:
print 'caught a timeout'
许多人认为 import *
有问题并试图避免它。这是因为以这种方式导入的两个或多个模块中的公共(public)变量名会相互冲突。
例如,考虑以下三个 Python 文件:
# File "a.py"
def foo():
print "this is a's foo function"
# File "b.py"
def foo():
print "this is b's foo function"
# File "yourcode.py"
from a import *
from b import *
foo()
如果你运行 yourcode.py
,你只会看到输出“这是 b 的 foo 函数”。
出于这个原因,我建议要么导入模块并使用它,要么从模块中导入特定名称:
例如,带有显式导入的代码如下所示:
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
只是打字多了一点点,但一切都是明确的,读者很清楚一切的来源。
关于python - 处理 Python 套接字中的超时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11865685/