当客户端与服务器断开连接时,我可以从 '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
。
我正在尝试使用 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
。