Asyncio Socket Server报错无输出问题求助(附可复现代码)
Python AsyncIO Socket服务器异常无输出的解决办法
问题原因
当asyncio.start_server为每个新连接创建的处理任务(即你的handle_events协程)抛出未捕获异常时,asyncio默认不会将这类后台任务的异常打印到控制台,只会静默终止任务——这就是你看不到int("")触发的ValueError输出的核心原因。
解决方法
方法一:在处理协程内部主动捕获异常
直接在handle_events中加入try-except块,捕获并打印异常,同时可以按需处理连接关闭逻辑:
修改后的server.py:
import asyncio class Server: def __init__(self, host: str, port: int): self.host = host self.port = port async def start_server(self): print("Server online") server = await asyncio.start_server(self.handle_events, self.host, self.port) async with server: await server.serve_forever() async def handle_events(self, reader: asyncio.StreamReader, writer: asyncio.StreamWriter): while True: try: print("here1") int("") print("here2") data = await reader.read(1024) if not data: continue print(f"received: {data}") except Exception as e: print(f"捕获到异常: {type(e).__name__}: {e}") # 异常后关闭连接并退出循环 writer.close() await writer.wait_closed() break async def start(): host = "127.0.0.1" port = 55551 server = Server(host=host, port=port) server_task = asyncio.create_task(server.start_server()) await asyncio.gather(server_task) if __name__ == "__main__": asyncio.run(start())
方法二:设置全局异常处理器
如果不想在每个协程中单独加try-except,可以给asyncio事件循环配置全局异常处理器,捕获所有未处理的任务异常:
修改server.py的主函数部分:
import asyncio class Server: # 保留原类代码不变 ... async def start(): # 保留原函数代码不变 ... def global_exception_handler(loop, context): print(f"全局捕获异常: {context['message']}") if 'exception' in context: exc = context['exception'] print(f"异常详情: {type(exc).__name__}: {exc}") if __name__ == "__main__": loop = asyncio.get_event_loop_policy().get_event_loop() loop.set_exception_handler(global_exception_handler) try: loop.run_until_complete(start()) finally: loop.close()
验证效果
启动修改后的server.py,再运行client.py,控制台会输出类似内容:
Server online here1 捕获到异常: ValueError: invalid literal for int() with base 10: ''
内容的提问来源于stack exchange,提问作者8azzxxx
相关产品推荐
相关产品推荐

