簡體   English   中英

當客戶端與服務器斷開連接時,我可以從“try:”塊中的 function 內部引發異常嗎?

[英]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)並在沒有消息時返回False ,或者在一切正常時返回{"header": msg_header, "data": msg}

我的問題是:如果client.recv() receive_message()內部失敗,它會引發異常並打印"client disconnected"嗎?

我確實提出了以下我認為可行的解決方案:

我定義了一個名為handle_disconnection()的 function 來處理上面代碼中的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

這是解決問題的有效和/或正確的編程方法嗎? 如果這種方法是錯誤的,我該如何正確處理?

如果client.recv()將引發異常,您將在receive_message()內部處理它,而handle_connection()將不會收到異常。

我建議您確定要通過異常或 if-else 控制流程的情況。 我認為receive_message()應該在出現連接問題時返回 message 值或拋出ConnectionError 如果套接字沒有消息,您可以返回None或引發NoMessagesAvailableError

還有一條規則告訴您應該捕獲指定的異常,而不是所有異常。 當您離開 memory 時,您的代碼將打印client disconnected

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM