有没有办法找到多个计时器中的哪一个引发了异常


import asyncio
from aiohttp import Timeout

async def main():
    try:
        with Timeout(1) as t1:
            with Timeout(1) as t2:
                await asyncio.sleep(2)
    except asyncio.TimeoutError as exc:        
        # Which one of timers raised this `exc`?
        # Something like:
        # get_caller(exc) is t1 -> False
        # get_caller(exc) is t2 -> True
        pass

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())

由于两个计时器具有相同的超时,因此它们都可以提高TimeoutError。我想知道是哪一个做的。可能吗?

async def main_async():
    try:
        with NamedTimeout('outer', 0.5) as t1:
            with NamedTimeout('inner', 0.3) as t2:
                await asyncio.sleep(2)
    except asyncio.TimeoutError as e:
        print(e.timeout_name)
class NamedTimeout(Timeout):
    def __init__(self, name, timeout, *, loop=None):
        super().__init__(timeout, loop=loop)
        self.name = name
    def __exit__(self, exc_type, exc_val, exc_tb):
        try:
            super().__exit__(exc_type, exc_val, exc_tb)
        except asyncio.TimeoutError as e:
            e.timeout_name = self.name
            raise

如果您更改超时值,您将看到它始终打印出较短超时的名称。

最新更新