首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当客户端断开与服务器的连接时,我可以从“try:”函数内部引发异常吗?

当客户端断开与服务器的连接时,我可以从“try:”函数内部引发异常吗?
EN

Stack Overflow用户
提问于 2020-12-30 11:53:24
回答 1查看 208关注 0票数 0

我试图用python套接字构建一个简单的服务器-客户端聊天室。

我有以下代码:

代码语言:javascript
复制
def handle_connection(client):
    while(1):
        try:
            message = receive_message()
            broadcast(message["data"])
        except:     # for now i don't mind which exception
              print("client disconnected")


def receive_message(client_socket):
    try:
        message_header = client_socket.recv(HEADER)
        if len(message_header) == 0:
            return False
        message_length = int(message_header.decode("utf-8"))

        message = client_socket.recv(message_length).decode("utf-8")
        return {"header": message_header, "data": message}

    except:  # most likely will trigger when a client disconnects
        return False

其中,receive_message()在其中调用client.recv(HEADER)并在没有消息时返回False,或者在一切正常时返回{"header": msg_header, "data": msg}

我的问题是:如果client.recv()由于客户端CLI关闭而在receive_message()内部失败,它会引发异常并打印"client disconnected"吗?

我确实想出了以下我认为可行的解决方案:

我定义了一个名为handle_disconnection()的函数,它处理上面代码中except中的所有内容。

代码语言:javascript
复制
def handle_connection(client_socket):
    while 1:
        try:
            message = receive_message()
            if not message:
                handle_disconnection(client_socket)
                break
            broadcast(message["data"])

        except:     # client disconnected
            handle_disconnection(client_socket)
            break

这是解决问题的有效和/或正确的编程方法吗?如果这种方法是错误的,我如何才能正确地处理它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-30 14:05:54

如果client.recv()将引发异常,您将在receive_message()中处理它,handle_connection()将不会收到异常。

我建议您在想要控制流的情况下确定异常情况或如果-否则的情况。我认为receive_message()应该返回消息的值,或者在出现连接问题时抛出ConnectionError。如果没有来自套接字的消息,则可以返回None或引发NoMessagesAvailableError

还有一条规则告诉您应该捕获指定的异常,而不是所有的异常。当内存不足时,代码将打印client disconnected

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65506543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档