Python 我是否可以从';中的函数内部引发异常;try:';当客户端与服务器断开连接时阻止?

Python 我是否可以从';中的函数内部引发异常;try:';当客户端与服务器断开连接时阻止?,python,python-3.x,sockets,return-value,try-except,Python,Python 3.x,Sockets,Return Value,Try Except,我正在尝试用python套接字构建一个简单的服务器客户端聊天室 我有以下代码: def handle_connection(client): while(1): try: message = receive_message() broadcast(message["data"]) except: # for now i don't mind which exception

我正在尝试用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)
并在没有消息时返回
False
,或者在一切正常时返回
{“HEADER”:msg_HEADER,“data”:msg}

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

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

我定义了一个名为
handle\u disconnection()
的函数,该函数处理
中的所有内容,但上面代码中的
除外

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
这是解决问题的有效和/或正确的编程方法吗? 如果此方法错误,如何正确处理它?

如果
client.recv()
将引发异常,您将在
receive\u message()
中处理它,而
handle\u connection()
将不会接收异常

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

还有一条规则告诉您应该捕获指定的异常,而不是所有异常。内存不足时,您的代码将打印
客户端断开连接