Python: except EOFError: ... 不起作用

发布于 2024-10-21 08:24:32 字数 472 浏览 1 评论 0原文

我有一个 try/ except 块,用于发送消息并等待客户端的确认。如果客户端终止,pickle 会引发 EOFError,但下面的代码不会捕获该错误并执行正常关闭。相反,它打印堆栈跟踪。我认为它与“除了socket.error,EOFError:”行有关 - 我是否使用错误的语法来处理socket.error和EOFError?

        try:
            msgs = [1]
            self.sock.send(pickle.dumps(msgs))
            rdy = pickle.loads(self.sock.recv(2097152))
        except socket.error, EOFError: 
            print 'log socketmanager closing'
            self.terminate()
            break

I have a try/except block that sends a message and waits for confirmation from client. If the client terminates, pickle raises an EOFError, but the code below does not catch the error and execute the graceful shut down. It instead prints stack trace. I assume it has to do with the line "except socket.error, EOFError:" - am I using the wrong syntax to handle both socket.error and EOFError there?

        try:
            msgs = [1]
            self.sock.send(pickle.dumps(msgs))
            rdy = pickle.loads(self.sock.recv(2097152))
        except socket.error, EOFError: 
            print 'log socketmanager closing'
            self.terminate()
            break

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

半衬遮猫 2024-10-28 08:24:33

在 Python 2.x 中,except a, b 形式捕获 a 类型的异常,并将其分配给名为 b 的变量。在您的情况下,这将导致 EOFError 被忽略。请尝试以下操作:

...
except (socket.error, EOFError):
    ...

编辑:详细说明一下,Python 3.0 中的新语法以及 2.6+ 中可用的新语法(尽管不是必需的)用于捕获异常的值是 except a as b

In Python 2.x, the form except a, b catches an exception of type a and assign it to a variable called b. In your case this would result in EOFError being ignored. Try this instead:

...
except (socket.error, EOFError):
    ...

Edit: to elaborate, the new syntax in Python 3.0, and available, though not required, in 2.6+, for capturing the value of an exception is except a as b.

心舞飞扬 2024-10-28 08:24:33

break 导致错误,它只能在 for 循环或 try/finally 块中使用,不能在 try/ except 中使用,请参阅文档更多

break is causing the error, it can only be used inside a for loop or a try/finally block, not try/except, see docs and more.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文