title: Asynchronous exception handling in Python
body: <p>I've the following code using <code>asyncio</code> and <code>aiohttp</code> to make asynchronous HTTP requests.</p>
  <pre><code>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(&quot;%s has error '%s'&quot; % (url, e))
      else:
          if resp.status &gt;= 400:
              raise Exception(&quot;%s has error '%s: %s'&quot; % (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)
  </code></pre>
  <p>For some reason, exceptions raised inside the <code>get</code> function are not caught:</p>
  <pre><code>Future/Task exception was never retrieved
  Traceback (most recent call last):
    File &quot;site-packages/asyncio/tasks.py&quot;, line 236, in _step
      result = coro.send(value)
    File &quot;mwe.py&quot;, line 25, in fill_data
      run['data'] = yield from get(url)
    File &quot;mwe.py&quot;, line 17, in get
      raise Exception(&quot;%s has error '%s: %s'&quot; % (url, resp.status, resp.reason))
  Exception: http://www.google.com/two has error '404: Not Found'
  </code></pre>
  <p>So, what is correct way to handle exceptions raised by coroutines?</p>