发生异常:TimeoutError异常:无描述

问题描述 投票:0回答:2

我专门使用 python 版本

3.10
来运行 websocket(或任何长
asyncio
进程)一段指定的时间段,这在 python 文档中有介绍。
.wait_for()
方法看起来是正确的解决方案。

我运行此代码(来自文档):

import asyncio

async def eternity():
    # Sleep for one hour
    await asyncio.sleep(3600)
    print('yay!')

async def main():
    # Wait for at most 1 second
    print('wait for at most 1 second...')
    try:
        await asyncio.wait_for(eternity(), timeout=1.0)
    except TimeoutError: 
        print('timeout!')


asyncio.run(main())

文档在这里: https://docs.python.org/3/library/asyncio-task.html?highlight=wait_for#asyncio.wait_for

但是,我收到以下错误:

Exception has occurred: TimeoutError
exception: no description

...基本上,

TimeoutError
异常没有按预期处理。

我的研究表明其他人一直在与错误作斗争,例如这里: 处理 Python 套接字中的超时错误

但是这些修复要么已经过时(与 3.10 无关),要么不起作用。我还注意到文档指定了“版本 3.10 中的更改:删除了循环参数”。所以我只对

3.10
及以上版本感兴趣。

所以我想知道如何让最小可重现的示例工作或者我做错了什么?

python websocket timeout python-asyncio
2个回答
1
投票

您可以删除 TimeoutError,以便它可以跳转到 print('timeout') 或者可以使用此示例来输出错误

except Exception as exc:
    print(f'The exception: {exc!r}')

0
投票

Python 中有很多超时错误。

将 except TimeoutError 替换为 except asyncio.TimeoutError 就可以了。

更新完整示例:

import asyncio

async def eternity():
    # Sleep for one hour
    await asyncio.sleep(3600)
    print('yay!')

async def main():
    # Wait for at most 1 second
    print('wait for at most 1 second...')
    try:
        await asyncio.wait_for(eternity(), timeout=1.0)
    except asyncio.TimeoutError: 
        print('timeout!')

asyncio.run(main())

显然 asyncio 文档中的示例是错误的(或者至少是误导性的)。 如果你查看 CPython 的源代码,asyncio.TimeoutError 在 Python 3.10 之前是与 TimeoutError 不同的异常,并且在 3.11 中更改为 TimeoutError 的别名。

© www.soinside.com 2019 - 2024. All rights reserved.