### 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
pretty_results is None and result_format != 'json',
            pretty_results is True,
            self._display.verbosity > 2,
        )
        if not indent and any(indent_conditions):
            indent = 4
        if pretty_results is False:
            
            indent = None
        
        abridged_result = strip_internal_keys(module_response_deepcopy(result))
        
        if not keep_invocation and self._display.verbosity < 3 and 'invocation' in result:
            del abridged_result['invocation']
        
        if self._display.verbosity < 3 and 'diff' in result:
            del abridged_result['diff']
        
        if 'exception' in abridged_result:
            del abridged_result['exception']
        if not serialize:
            
            
            
            return abridged_result
        if result_format == 'json':
            try:
                return json.dumps(abridged_result, cls=AnsibleJSONEncoder, indent=indent, ensure_ascii=False, sort_keys=sort_keys)
            except TypeError: