【问题标题】:socket.settimeout quits program not using except clausesocket.settimeout 退出程序不使用 except 子句
【发布时间】:2015-02-04 07:38:45
【问题描述】:

我有下面的python代码,没有收到数据,程序退出,没有运行带有打印和返回语句的except子句

对正在发生的事情有什么想法吗?

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

【问题讨论】:

  • 也许它成功了,所以except: 子句永远不会触发? (如果您希望我们进一步调试,您将需要提供 minimal, complete, verifiable example 或者,如果失败,至少需要更多信息和一些调试信息,例如如果您 print pkt 正确会发生什么在pkt =等之后)
  • 抱歉,我已经为此工作了很长时间,只是错误地假设每个人都在船上。这个 sn-p 是扫描蓝牙信号的代码的一部分。存在信号时一切正常。但如果没有信号可用,则会挂在 sock.recv(255) 上。因此,如果没有信号可用,我将上面的代码在 10 秒后超时。但它没有转到 except 子句,而是简单地退出并显示超时错误代码。

标签: python sockets timeout


【解决方案1】:

问题在于socket.timeout 异常与socket.error 是完全不同的异常。因此,except socket.error: 不会捕获 socket.timeout,原因与 except ValueError: 不会捕获 KeyError 的原因相同。

(相关文档在 2.x 中并不十分明显。这是在 Python 3.3/PEP 3151 中清理的众多内容之一——请参阅the nice new docs——但只要你坚持2.x 你不会从中受益。)

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

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

如果您还想以同样的方式处理套接字错误(例如,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

【讨论】:

  • abarnert,我明白你在说什么。但是我尝试了 socket.timeout 和 socket.error 两者都没有发现错误,只是用-----文件“/home/pi/ming-blue/blescan.py”,第144行将我从程序中引导了出来,在 parse_events pkt = sock.recv(255) _bluetooth.timeout: timed out ____ fyi,我在树莓派上使用 python 2.7.3,所以我不确定这是否是原因
  • 它在错误消息中告诉你异常是什么类型:_bluetooth.timeout(我猜它也可以作为 bluetooth.timeout,但与 socket.timeout 不同) .您必须捕获正确的异常,这几乎总是记录在文档中并列在错误消息中,而不仅仅是尝试猜测它。
  • @user1117057:另外,这正是帮助要求您提供完整示例并在您的问题中包含错误消息的原因。我假设 sock 是一个 socket.socket 对象,因此你的异常是一个 socket.timeout。阅读您的问题 - 是否有任何内容暗示该假设可能是错误的?
【解决方案2】:
sock.settimeout(10)
try:
    pkt = sock.recv(255)
except:
    print "connection timed out!"
    return

我只是更改了 except 行

【讨论】:

  • 总的来说,这是一个可怕的想法。现在您忽略了任何类型的错误,而不仅仅是您试图忽略的错误。
猜你喜欢
  • 1970-01-01
  • 2019-03-05
  • 1970-01-01
  • 2015-07-23
  • 2016-05-21
  • 2015-03-06
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
相关资源
最近更新 更多