You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:48