##### 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

else:
                                            found = True
                                        if listening_handler.notify_host(original_host):
                                            self._tqm.send_callback('v2_playbook_on_notify', listening_handler, original_host)
                                
                                if not found:
                                    msg = ("The requested handler '%s' was not found in either the main handlers list nor in the listening "
                                           "handlers list" % handler_name)
                                    if C.ERROR_ON_MISSING_HANDLER:
                                        raise AnsibleError(msg)
                                    else:
                                        display.warning(msg)
                    if 'add_host' in result_item:
                        
                        new_host_info = result_item.get('add_host', dict())
                        self._inventory.add_dynamic_host(new_host_info, result_item)
                        
                        if result_item.get('changed') and new_host_info['host_name'] not in self._hosts_cache_all:
                            self._hosts_cache_all.append(new_host_info['host_name'])
                    elif 'add_group' in result_item:
                        
                        self._inventory.add_dynamic_group(original_host, result_item)
                    if 'add_host' in result_item or 'add_group' in result_item:
                        item_vars = _get_item_vars(result_item, original_task)
                        found_task_vars = self._queued_task_cache.get((original_host.name, task_result._task._uuid))['task_vars']
                        if item_vars:
                            all_task_vars = combine_vars(found_task_vars, item_vars)
                        else:
                            all_task_vars = found_task_vars
                        all_task_vars[original_task.register] = wrap_var(result_item)