socket.settimeout退出程序不使用except子句

时间:2014-12-06 02:30:17

标签: python sockets timeout

我有下面的python代码,没有收到数据,程序退出而没有运行带有print和return语句的except子句

有关正在发生的事情的任何想法?

sock.settimeout(10)
try:
    pkt = sock.recv(255)
except socket.error:
    print "connection timed out!"
    return

2 个答案:

答案 0 :(得分:1)

问题是socket.timeout例外与socket.error完全不同。因此,except socket.error:socket.timeout没有抓住except ValueError:而导致KeyError无法抓住sock.settimeout(10) try: pkt = sock.recv(255) except socket.timeout: print "connection timed out!" return

(这个文档在2.x中并不是很明显。这是在Python 3.3 / PEP 3151中清理过的很多东西之一 - 见the nice new docs - 但只要你和& #39;坚持2.x你不会从中受益。)

正确的解决方案是处理正确的错误:

recv

如果您还想以同样的方式处理套接字错误(例如,来自sock.settimeout(10) try: pkt = sock.recv(255) except (socket.timeout, socket.error) as e: print "connection timed out or erred out: {}!".format(e) return 调用的失败):

as e

注意我还添加了sock.settimeout(10) try: pkt = sock.recv(255) except socket.timeout: print "connection timed out!" return except socket.error as e: print "connection erred out: {}!".format(e) return 并将其添加到输出中。这样,如果出现意外情况,您就会知道 出错了什么,而不必猜测。

当然,您可能也希望以不同方式处理这两个错误:

{{1}}

答案 1 :(得分:-1)

sock.settimeout(10)
try:
    pkt = sock.recv(255)
except:
    print "connection timed out!"
    return

我刚刚更改了除行