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

can i raise exception from inside a function in the 'try:' block when client disconnects from the server?

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

我有以下代码:

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) 和 returns 要么 False 没有消息时,要么 {"header": msg_header, "data": msg} 一切正常时。

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

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

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

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

这是解决问题的有效 and/or 正确编程方法吗? 如果这种做法是错误的,我该如何正确处理?

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

我建议您确定要使用异常或 if-else 控制流程的情况。我认为 receive_message() 应该 return 消息的值,或者在出现连接问题时抛出 ConnectionError。如果没有来自套接字的消息,您可以 return None 或提高 NoMessagesAvailableError.

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