我试图抓住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'
我对此代码的问题有两个方面:
asyncio.get_event_loop
,我会收到以下错误:
线程'Thread-1'中没有当前的事件循环。loop.run_until_complete(test2())
):
RuntimeError:此事件循环已在运行这是堆栈跟踪:
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
调用中抛出的异常?
非常感谢!
您无法捕获此错误,因为在事件循环完成它的工作之前它不会发生在某处:
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: