### Summary

If a module calls `fail_json()` and provides `exception=None`, this will crash every callback that uses `_handle_exception` from `CallbackBase`: if verbosity is < 3, it will try to call `split` on `None`, and otherwise it will try to concatenate a string with `None` (which results in `TypeError`).

### Issue Type

Bug Report

### Component Name

lib/ansible/plugins/callback/__init__.py

### Ansible Version

```console
devel
```


### Configuration

```console
*
```


### OS / Environment

*

### Steps to Reproduce

*

### Expected Results

*

### Actual Results

```console
*
```


### Code of Conduct

- [X] I agree to follow the Ansible Code of Conduct
host = result._host.get_name()
        jid = result._result.get('ansible_job_id')
        self.runner_on_async_ok(host, result._result, jid)
    def v2_runner_on_async_failed(self, result):
        host = result._host.get_name()
        
        
        jid = result._result.get('ansible_job_id')
        if not jid and 'async_result' in result._result:
            jid = result._result['async_result'].get('ansible_job_id')
        self.runner_on_async_failed(host, result._result, jid)
    def v2_playbook_on_start(self, playbook):
        self.playbook_on_start()
    def v2_playbook_on_notify(self, handler, host):
        self.playbook_on_notify(host, handler)
    def v2_playbook_on_no_hosts_matched(self):
        self.playbook_on_no_hosts_matched()
    def v2_playbook_on_no_hosts_remaining(self):
        self.playbook_on_no_hosts_remaining()
    def v2_playbook_on_task_start(self, task, is_conditional):
        self.playbook_on_task_start(task.name, is_conditional)
    
    def v2_playbook_on_cleanup_task_start(self, task):
        pass  
    def v2_playbook_on_handler_task_start(self, task):
        pass  
    def v2_playbook_on_vars_prompt(self, varname, private=True, prompt=None, encrypt=None, confirm=False, salt_size=None, salt=None, default=None, unsafe=None):
        self.playbook_on_vars_prompt(varname, private, prompt, encrypt, confirm, salt_size, salt, default, unsafe)
    
    def v2_playbook_on_import_for_host(self, result, imported_file):