##### SUMMARY
There are cases where you are using a role from inside a block, and the role itself uses a block, and you want to propagate errors from the inner block to be handled in a `rescue` in an outer block, and you want access to the `ansible_failed_result` (and `ansible_failed_task` - but see https://github.com/ansible/ansible/issues/57399) from the inner block.  This works fine if the inner block has no `rescue` or `always` clause - the error from the inner block is propagated to the outer block where it can be caught in a `rescue` clause with the expected information set in `ansible_failed_result`.

The problem arises when you want to use `always` or `rescue` in the inner block.  The outer `rescue` clause is still called, which means an error was detected by Ansible and handled, but the context information is gone and `ansible_failed_result` is undefined.  Same if a `rescue` is used in the inner block, with or without the `always`.  You can re-raise the error with the `ansible_failed_result` by using it as the only value for a `fail` module `msg` argument:
```yaml
        - block:
            ...
          rescue:
            - name: re-raise the error from the inner block
              fail:
                msg: "{{ ansible_failed_result }}"
```
This works in Ansible 2.9 and 2.10, but I don't know if it is "accidental" behavior or if this is the fully supported way to do this.  I would like to see if this is officially supported by Ansible core and, if this is the correct way to "catch" and "re-raise" errors, it should be documented in the block/rescue/always documentation.

See also https://richm.github.io/how-to-catch-and-reraise-errors-in-ansible

##### ISSUE TYPE
- Documentation Report

##### COMPONENT NAME
https://docs.ansible.com/ansible/latest/user_guide/playbooks_blocks.html#

##### ANSIBLE VERSION
```
ansible 2.9.14
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/rmeggins/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.8/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.8.6 (default, Sep 25 2020, 00:00:00) [GCC 10.2.1 20200723 (Red Hat 10.2.1-1)]
```

##### CONFIGURATION
```
no output?
```

##### OS / ENVIRONMENT
Fedora 32 - ansible 2.9 and 2.10

##### ADDITIONAL INFORMATION
https://richm.github.io/how-to-catch-and-reraise-errors-in-ansible

self._hosts_cache = []
        self._hosts_cache_all = []
        self.debugger_active = C.ENABLE_TASK_DEBUGGER
    def _set_hosts_cache(self, play, refresh=True):
        """Responsible for setting _hosts_cache and _hosts_cache_all
        See comment in ``__init__`` for the purpose of these caches
        """
        if not refresh and all((self._hosts_cache, self._hosts_cache_all)):
            return
        if not play.finalized and Templar(None).is_template(play.hosts):
            _pattern = 'all'
        else:
            _pattern = play.hosts or 'all'
        self._hosts_cache_all = [h.name for h in self._inventory.get_hosts(pattern=_pattern, ignore_restrictions=True)]
        self._hosts_cache = [h.name for h in self._inventory.get_hosts(play.hosts, order=play.order)]
    def cleanup(self):
        
        for sock in self._active_connections.values():
            try:
                conn = Connection(sock)
                conn.reset()
            except ConnectionError as e:
                
                display.debug("got an error while closing persistent connection: %s" % e)
        self._final_q.put(_sentinel)
        self._results_thread.join()
    def run(self, iterator, play_context, result=0):