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

Python asyncio.open_connection()可能抛出的所有异常有哪些?

asyncio.open_connection() 可能抛出的异常及查找途径

虽然官方文档没有直接列出asyncio.open_connection()的异常列表,但你可以从它的底层实现和依赖模块推断出所有可能的异常类型,以下是核心异常分类和查找方法:

主要异常类型

  • socket相关异常(继承自OSError):这是网络连接阶段最常见的异常,涵盖所有底层socket操作错误:
    • ConnectionRefusedError:目标主机拒绝连接(比如对应端口未监听服务)
    • TimeoutError:连接超时(网络不通或目标无响应)
    • socket.gaierror:域名解析失败(使用hostname而非IP时出现)
    • PermissionError:无权限发起连接(比如本地防火墙限制、系统权限不足)
    • OSError:其他通用网络错误(如网络不可达、无效地址格式等)
  • asyncio任务相关异常:
    • asyncio.CancelledError:连接任务被主动取消时抛出
    • asyncio.TimeoutError:当通过asyncio.wait_for()等方法给连接操作设置超时,或open_connection的timeout参数触发超时时抛出(部分Python版本中,该参数可能底层仍抛出socket的TimeoutError,需注意区分)

查找完整异常的方法

  1. 查看源码:asyncio.open_connection()内部调用loop.create_connection(),后者会处理socket的创建、连接流程,跟踪这部分源码能找到所有可能抛出的异常。
  2. 参考socket模块文档:因为asyncio的TCP连接底层依赖标准socket模块,socket模块定义的所有网络相关异常,都可能在open_connection()中出现。
  3. 场景测试:模拟各种错误场景(比如连接不存在的端口、无效域名、断开网络),捕获异常并打印类型,能直观获取实际运行中可能遇到的错误。

异常处理建议

如果要向命令源上报所有异常,可以按层级捕获:

import asyncio
import socket

async def connect():
    try:
        reader, writer = await asyncio.open_connection('example.com', 1234)
        # 后续业务操作
    except ConnectionRefusedError as e:
        print(f"上报异常: 连接被拒绝 - {str(e)}")
    except socket.gaierror as e:
        print(f"上报异常: 域名解析失败 - {str(e)}")
    except TimeoutError as e:
        print(f"上报异常: 连接超时 - {str(e)}")
    except PermissionError as e:
        print(f"上报异常: 无连接权限 - {str(e)}")
    except asyncio.CancelledError as e:
        print(f"上报异常: 连接任务被取消 - {str(e)}")
    except OSError as e:
        print(f"上报异常: 网络错误 - {str(e)}")
    except Exception as e:
        print(f"上报异常: 未知错误 - {str(e)}")

内容的提问来源于stack exchange,提问作者Jindrich Vavruska

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 00:04:52