从 this question 开始,我尝试按照 Maksim Skurydzin 的回答(截至 2020 年 1 月 1 日下午 6:33 PST 的第三个回答),但我得到了 NameError: name 'timeout' is not defined
。
我正在尝试使用 TRY EXCEPT 在使用套接字时捕获超时。我从 IBM tutorial "Sockets programming in Python" 中的“清单 11. 简单的 Python 数据报回显服务器”开始:
import socket
dgramSock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
dgramSock.bind( ('', 23000) )
while 1:
msg, (addr, port) = dgramSock.recvfrom( 100 )
dgramSock.sendto( msg, (addr, port) )
我只是添加了几行来得到这个:
import socket
from time import sleep
dgramSock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
dgramSock.bind(('', 62020))
dgramSock.setblocking(0)
while 1:
try:
msg, (addr, port) = dgramSock.recvfrom(64)
print msg
dgramSock.sendto(msg, (addr, port))
except timeout:
sleep(.001)
当我尝试运行它时会出现上述错误。这在我将 except timeout:
更改为 except:
时按照我希望的方式工作,但是 Python 文档不鼓励以这种方式使用 except
(8.3. 处理异常...“最后一个 except 子句可能会省略异常名称,用作通配符。使用它要格外小心,因为这样很容易掩盖真正的编程错误!”)。为了遵循这个建议,我找到了一个看起来非常合适的答案(上面提到的),我认为我正确地遵循了它。我做错了什么?