python asyncio 异常处理_Python中的异步异常处理

我有以下代码使用asyncio和aiohttp来进行异步HTTP请求。

import sys

import asyncio

import aiohttp

@asyncio.coroutine

def get(url):

try:

print('GET %s' % url)

resp = yield from aiohttp.request('GET', url)

except Exception as e:

raise Exception("%s has error '%s'" % (url, e))

else:

if resp.status >= 400:

raise Exception("%s has error '%s: %s'" % (url, resp.status, resp.reason))

return (yield from resp.text())

@asyncio.coroutine

def fill_data(run):

url = 'http://www.google.com/%s' % run['name']

run['data'] = yield from get(url)

def get_runs():

runs = [ {'name': 'one'}, {'name': 'two'} ]

loop = asyncio.get_event_loop()

task = asyncio.wait([fill_data(r) for r in runs])

loop.run_until_complete(task)

return runs

try:

get_runs()

except Exception as e:

print(repr(e))

sys.exit(1)

由于某些原因,get函数中引发的异常没有被捕获:

Future/Task exception was never retrieved

Traceback (most recent call last):

File "site-packages/asyncio/tasks.py", line 236, in _step

result = coro.send(value)

File "mwe.py", line 25, in fill_data

run['data'] = yield from get(url)

File "mwe.py", line 17, in get

raise Exception("%s has error '%s: %s'" % (url, resp.status, resp.reason))

Exception: http://www.google.com/two has error '404: Not Found'

那么,什么是正确的方式来处理由couroutines提出的异常?

你可能感兴趣的:(python,asyncio,异常处理)