当使用“async with”失败时,会发生什么情况?

2024-05-19 01:40:22 发布

您现在位置:Python中文网/ 问答频道 /正文

报告提到:

async with EXPR as VAR:
    BLOCK

在语义上等同于:

mgr = (EXPR)
aexit = type(mgr).__aexit__
aenter = type(mgr).__aenter__

VAR = await aenter(mgr)
try:
    BLOCK
except:
    if not await aexit(mgr, *sys.exc_info()):
        raise
else:
    await aexit(mgr, None, None, None)

但是,VAR = await aenter(mgr)不在try块中,因此我想知道是否允许__aenter__()失败

例如,在这个aiohttp片段中(取自Getting Started):

import aiohttp
import asyncio

async def main():

    async with aiohttp.ClientSession() as session:
        async with session.get('http://python.org') as response:

            print("Status:", response.status)
            print("Content-type:", response.headers['content-type'])

            html = await response.text()
            print("Body:", html[:15], "...")

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

session.get('http://python.org')可能会失败,并且不会调用__aexit__()来关闭上下文


Tags: nonegetasyncaiohttpresponsesessionvaras
1条回答
网友
1楼 · 发布于 2024-05-19 01:40:22

如果__aenter__失败,那么__aexit__确实不会运行。在这种情况下,任何必要的清理都是__aenter__的责任

__aenter__有更多关于它达到了什么程度以及成功初始化了什么或没有初始化什么的信息,因此让__aenter__处理这个比期望__aexit__处理清除任意部分输入的上下文管理器状态更方便

(这与普通的非异步上下文管理器完全相同。)

相关问题 更多 >

    热门问题