如何捕获concurrent.futures._base.TimeoutError

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

我试图抓住run_until_complete内部抛出的异常,但无论我尝试什么,我似乎无法正常捕捉它们。

这是我最近的尝试(注意,我正在使用Pypputeer,Python中的Puppeteer分支,使用asyncio):

import asyncio
from pyppeteer.launcher import launch

async def test(instance):
    page = await instance.newPage()
    await page.goto('http://www.google.com', {'waitUntil': 'load', 'timeout': 1})
    await page.pdf({'path': 'example.pdf'})


async def test2():
    instance = launch(headless=True)
    try:
        task = asyncio.ensure_future(test(instance))
        print(task)
        await task
    except:
        print("Caught!")

    instance.close()


def __main__():
    try:
        loop = asyncio.new_event_loop()
        asyncio.set_event_loop(loop)
        loop.run_until_complete(test2())
    except:
        print("ERROR")
    return 'ok'

我对此代码的问题有两个方面:

  1. 如果我改为asyncio.get_event_loop,我会收到以下错误: 线程'Thread-1'中没有当前的事件循环。
  2. 如果我将超时更改为合适的值,我会收到以下错误(在loop.run_until_complete(test2())): RuntimeError:此事件循环已在运行
  3. 如果我将超时设置为1(强制错误),我会得到下面指出的异常,如控制台中所示,并显示文本“ERROR”。 (但没有被抓住)。

这是堆栈跟踪:

Exception in callback NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at /home/user/www/project/api/env/lib/python3.6/site-packages/pyppeteer/navigator_watcher.py:49
handle: <Handle NavigatorWatcher.waitForNavigation.<locals>.watchdog_cb(<Task finishe...> result=None>) at /home/user/www/project/api/env/lib/python3.6/site-packages/pyppeteer/navigator_watcher.py:49>
Traceback (most recent call last):
  File "/usr/lib64/python3.6/asyncio/events.py", line 145, in _run
    self._callback(*self._args)
  File "/home/user/www/project/api/env/lib/python3.6/site-packages/pyppeteer/navigator_watcher.py", line 52, in watchdog_cb
    self._timeout)
  File "/home/user/www/project/api/env/lib/python3.6/site-packages/pyppeteer/navigator_watcher.py", line 40, in _raise_error
    raise error
concurrent.futures._base.TimeoutError: Navigation Timeout Exceeded: 1 ms exceeded

那么,TLDR,如何捕获在asyncio的run_until_complete调用中抛出的异常?

非常感谢!

python python-3.x python-asyncio
1个回答
0
投票

您无法捕获此错误,因为在事件循环完成它的工作之前它不会发生在某处:

loop.run_until_complete(test2())
print('TEST !!!')  # You will see this line, because there was no exception before

但如果你看一下整个追溯,你会看到:

Error in atexit._run_exitfuncs:

这意味着在使用atexit处理程序注册的Pypputeer函数中发生了异常。你应该在那里搜索如何捕获异常,但我不确定它是否可能。

如果在执行退出处理程序期间引发异常,则会打印回溯(除非引发SystemExit)并保存异常信息。在所有退出处理程序都有机会运行之后,将重新引发要引发的最后一个异常。


没有关系,但never do这样的事情。

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