diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 13e14df..f8566ec 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -20,7 +20,7 @@ jobs:
       - run: |
           pip install wheel
           python setup.py bdist_wheel sdist --formats=gztar
-      - uses: actions/upload-artifact@v2
+      - uses: actions/upload-artifact@v3.1.1
         with:
           name: ${{ github.sha }}
           path: dist/*
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 236a25d..f638173 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,7 +21,7 @@ jobs:
 
     - uses: actions/setup-python@v4
       with:
-        python-version: 3.8
+        python-version: '3.10'
 
     - name: Install dependencies
       run: |
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 0fb53d7..20e0535 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,11 +1,11 @@
 repos:
   - repo: https://github.com/psf/black
-    rev: 22.3.0
+    rev: 22.12.0
     hooks:
     - id: black
       args: [--line-length=88, --safe]
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.1.0
+    rev: v4.4.0
     hooks:
     - id: check-case-conflict
     - id: check-merge-conflict
@@ -15,13 +15,13 @@ repos:
     - id: debug-statements
     - id: requirements-txt-fixer
   - repo: https://github.com/pycqa/isort
-    rev: 5.10.1
+    rev: 5.11.4
     hooks:
       - id: isort
         name: isort (python)
         args: ['--force-single-line-imports', '--profile', 'black']
   - repo: https://github.com/pycqa/flake8
-    rev: 4.0.1
+    rev: 6.0.0
     hooks:
       - id: flake8
         args: [ '--max-line-length', '100', '--max-doc-length', '120' ]
diff --git a/CHANGES b/CHANGES
index fa3e8cc..5542677 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,8 +2,9 @@
 ------
 
 * Add Python 3.11 support
-* Fix type annotations of `CallList`.
+* Fix type annotations of `CallList`. See #593
 * Replaced toml with tomli and tomli-w.
+* `request` object is attached to any custom exception provided as `Response` `body` argument. See #588
 
 0.22.0
 ------
diff --git a/README.rst b/README.rst
index 6610e7e..0e4eec5 100644
--- a/README.rst
+++ b/README.rst
@@ -505,6 +505,8 @@ Request Keyword Arguments Matcher
 To validate request arguments use the ``matchers.request_kwargs_matcher`` function to match
 against the request kwargs.
 
+Only following arguments are supported: ``timeout``, ``verify``, ``proxies``, ``stream``, ``cert``.
+
 Note, only arguments provided to ``matchers.request_kwargs_matcher`` will be validated.
 
 .. code-block:: python
diff --git a/responses/__init__.py b/responses/__init__.py
index 0969312..514392b 100644
--- a/responses/__init__.py
+++ b/responses/__init__.py
@@ -569,6 +569,7 @@ class Response(BaseResponse):
 
     def get_response(self, request: "PreparedRequest") -> HTTPResponse:
         if self.body and isinstance(self.body, Exception):
+            setattr(self.body, "request", request)
             raise self.body
 
         headers = self.get_headers()

diff --git a/responses/tests/test_responses.py b/responses/tests/test_responses.py
index 53924df..e8197a3 100644
--- a/responses/tests/test_responses.py
+++ b/responses/tests/test_responses.py
@@ -2494,3 +2494,20 @@ class TestMaxRetry:
 
         run()
         assert_reset()
+
+
+def test_request_object_attached_to_exception():
+    """Validate that we attach `request` object to custom exception supplied as body"""
+
+    @responses.activate
+    def run():
+        url = "https://httpbin.org/delay/2"
+        responses.get(url, body=requests.ReadTimeout())
+
+        try:
+            requests.get(url, timeout=1)
+        except requests.ReadTimeout as exc:
+            assert type(exc.request) == requests.models.PreparedRequest
+
+    run()
+    assert_reset()

Exception variable does not include request object
### Describe the bug

When handling an exception in the requests library, the exception variable stores the `request` object, which can be very helpful in grabbing details about the failed request:

```
try:
    requests.get(<URL>)
    return "Request succeeded"
except Exception as exc:
    request = exc.request  # <- requests.models.PreparedRequest
    return f"Request to url {request.url} with body {request.body} failed."
```

I want to use the responses library to test code like this but `exc.request` just returns `None`.

### Additional context

_No response_

### Version of `responses`

0.21.0

### Steps to Reproduce

The following snippet shows the requests library behavior.

```python
import requests

def make_request(verb):
    try:
        requests.request(verb, "https://httpbin.org/delay/2", timeout=1)
    except requests.ReadTimeout as exc:
        return type(exc.request)

assert make_request("GET") == requests.models.PreparedRequest
assert make_request("POST") == requests.models.PreparedRequest
```

The following tests show the different behavior in the `responses` library. Both tests fail because `make_request(verb)` is returning `None` instead of `requests.models.PreparedRequest`.

```python
import requests
import responses

@responses.activate
def test_make_get_request():
    responses.get("https://httpbin.org/delay/2", body=requests.ReadTimeout())
    assert make_request("GET") == requests.models.PreparedRequest

@responses.activate
def test_make_post_request():
    responses.post("https://httpbin.org/delay/2", body=requests.ReadTimeout())
    assert make_request("POST") == requests.models.PreparedRequest
```

### Expected Result

Both unit tests in the "Steps to Reproduce" section fail. They should pass.

### Actual Result

Looks like the `request` object is not being passed to the Exception [here](https://github.com/getsentry/responses/blob/6144ef5dcc84389e395592e54628ebb0a42e34de/responses/__init__.py#L530)? I'm happy to work on a PR if you think this is a bug.
responses/tests/test_responses.py::test_request_object_attached_to_exception
responses/tests/test_responses.py::test_response responses/tests/test_responses.py::test_response_encoded responses/tests/test_responses.py::test_response_with_instance responses/tests/test_responses.py::test_replace[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_replace[original1-replacement1] responses/tests/test_responses.py::test_replace[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_replace_error[http://example.com/one-http://example\\.com/one] responses/tests/test_responses.py::test_replace_error[http://example\\.com/one-http://example.com/one] responses/tests/test_responses.py::test_replace_response_object_error responses/tests/test_responses.py::test_upsert_replace[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_upsert_replace[original1-replacement1] responses/tests/test_responses.py::test_upsert_replace[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_upsert_add[http://example.com/two-http://example.com/two] responses/tests/test_responses.py::test_upsert_add[original1-replacement1] responses/tests/test_responses.py::test_upsert_add[http://example\\.com/two-http://example\\.com/two] responses/tests/test_responses.py::test_remove responses/tests/test_responses.py::test_response_equality[args10-kwargs10-args20-kwargs20-True] responses/tests/test_responses.py::test_response_equality[args11-kwargs11-args21-kwargs21-False] responses/tests/test_responses.py::test_response_equality[args12-kwargs12-args22-kwargs22-False] responses/tests/test_responses.py::test_response_equality[args13-kwargs13-args23-kwargs23-True] responses/tests/test_responses.py::test_response_equality_different_objects responses/tests/test_responses.py::test_connection_error responses/tests/test_responses.py::test_match_querystring responses/tests/test_responses.py::test_match_querystring_empty responses/tests/test_responses.py::test_match_querystring_error responses/tests/test_responses.py::test_match_querystring_regex responses/tests/test_responses.py::test_match_querystring_error_regex responses/tests/test_responses.py::test_match_querystring_auto_activates responses/tests/test_responses.py::test_match_querystring_missing_key responses/tests/test_responses.py::test_accept_string_body responses/tests/test_responses.py::test_accept_json_body responses/tests/test_responses.py::test_no_content_type responses/tests/test_responses.py::test_arbitrary_status_code responses/tests/test_responses.py::test_throw_connection_error_explicit responses/tests/test_responses.py::test_callback responses/tests/test_responses.py::test_deprecated_package_attributes responses/tests/test_responses.py::test_callback_deprecated_stream_argument responses/tests/test_responses.py::test_callback_deprecated_match_querystring_argument responses/tests/test_responses.py::test_callback_match_querystring_default_false responses/tests/test_responses.py::test_callback_exception_result responses/tests/test_responses.py::test_callback_exception_body responses/tests/test_responses.py::test_callback_no_content_type responses/tests/test_responses.py::test_callback_content_type_dict responses/tests/test_responses.py::test_callback_matchers responses/tests/test_responses.py::test_callback_matchers_fail responses/tests/test_responses.py::test_callback_content_type_tuple responses/tests/test_responses.py::test_regular_expression_url responses/tests/test_responses.py::test_base_response_get_response responses/tests/test_responses.py::test_custom_adapter responses/tests/test_responses.py::test_responses_as_context_manager responses/tests/test_responses.py::test_activate_doesnt_change_signature responses/tests/test_responses.py::TestFixtures::test_function responses/tests/test_responses.py::TestFixtures::test_function_decorated responses/tests/test_responses.py::test_activate_mock_interaction responses/tests/test_responses.py::test_activate_doesnt_change_signature_with_return_type responses/tests/test_responses.py::test_activate_doesnt_change_signature_for_method responses/tests/test_responses.py::test_response_cookies responses/tests/test_responses.py::test_response_cookies_secure responses/tests/test_responses.py::test_response_cookies_multiple responses/tests/test_responses.py::test_response_cookies_session[True-True] responses/tests/test_responses.py::test_response_cookies_session[True-False] responses/tests/test_responses.py::test_response_cookies_session[True-None] responses/tests/test_responses.py::test_response_cookies_session[False-True] responses/tests/test_responses.py::test_response_cookies_session[False-False] responses/tests/test_responses.py::test_response_cookies_session[False-None] responses/tests/test_responses.py::test_response_cookies_session[None-True] responses/tests/test_responses.py::test_response_cookies_session[None-False] responses/tests/test_responses.py::test_response_cookies_session[None-None] responses/tests/test_responses.py::test_response_callback responses/tests/test_responses.py::test_response_filebody responses/tests/test_responses.py::test_use_stream_twice_to_double_raw_io responses/tests/test_responses.py::test_assert_all_requests_are_fired responses/tests/test_responses.py::test_allow_redirects_samehost responses/tests/test_responses.py::test_path_segments responses/tests/test_responses.py::test_handles_unicode_querystring responses/tests/test_responses.py::test_handles_unicode_url responses/tests/test_responses.py::test_handles_unicode_body responses/tests/test_responses.py::test_handles_buffered_reader_body responses/tests/test_responses.py::test_headers responses/tests/test_responses.py::test_content_length_error responses/tests/test_responses.py::test_stream_with_none_chunk_size responses/tests/test_responses.py::test_legacy_adding_headers responses/tests/test_responses.py::test_legacy_adding_headers_with_content_type responses/tests/test_responses.py::test_auto_calculate_content_length_string_body responses/tests/test_responses.py::test_auto_calculate_content_length_bytes_body responses/tests/test_responses.py::test_auto_calculate_content_length_json_body responses/tests/test_responses.py::test_auto_calculate_content_length_unicode_body responses/tests/test_responses.py::test_auto_calculate_content_length_doesnt_work_for_buffered_reader_body responses/tests/test_responses.py::test_multiple_responses responses/tests/test_responses.py::test_multiple_responses_intermixed responses/tests/test_responses.py::test_multiple_urls responses/tests/test_responses.py::test_multiple_methods responses/tests/test_responses.py::test_passthrough_flag responses/tests/test_responses.py::test_passthrough_kwarg responses/tests/test_responses.py::test_passthrough_response responses/tests/test_responses.py::test_passthrough_response_stream responses/tests/test_responses.py::test_passthru_prefixes responses/tests/test_responses.py::test_passthru responses/tests/test_responses.py::test_passthru_regex responses/tests/test_responses.py::test_passthru_does_not_persist_across_tests responses/tests/test_responses.py::test_method_named_param responses/tests/test_responses.py::test_passthru_unicode responses/tests/test_responses.py::test_custom_target responses/tests/test_responses.py::test_request_param[http://example.com] responses/tests/test_responses.py::test_request_param[http://example.com/some/path] responses/tests/test_responses.py::test_request_param[http://example.com/other/path/] responses/tests/test_responses.py::test_request_param_with_multiple_values_for_the_same_key responses/tests/test_responses.py::test_assert_call_count[http://example.com] responses/tests/test_responses.py::test_assert_call_count[http://example.com?hello=world] responses/tests/test_responses.py::test_call_count_with_matcher responses/tests/test_responses.py::test_call_count_without_matcher responses/tests/test_responses.py::test_fail_request_error responses/tests/test_responses.py::test_response_representations[response_params0-<Response(url='http://example.com/' responses/tests/test_responses.py::test_response_representations[response_params1-<Response(url='http://another-domain.com/' responses/tests/test_responses.py::test_response_representations[response_params2-<Response(url='http://abcd.com/' responses/tests/test_responses.py::test_mocked_responses_list_registered responses/tests/test_responses.py::test_rfc_compliance[http://service-A/foo?q=fizz-http://service-a/foo?q=fizz] responses/tests/test_responses.py::test_rfc_compliance[http://service-a/foo-http://service-A/foo] responses/tests/test_responses.py::test_rfc_compliance[http://someHost-AwAy/-http://somehost-away/] responses/tests/test_responses.py::test_rfc_compliance[http://fizzbuzz/foo-http://fizzbuzz/foo] responses/tests/test_responses.py::test_requests_between_add responses/tests/test_responses.py::test_responses_reuse responses/tests/test_responses.py::TestStrictWrapper::test_strict_wrapper responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[True] responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[False] responses/tests/test_responses.py::TestStrictWrapper::test_nested_decorators[None] responses/tests/test_responses.py::TestMultipleWrappers::test_wrapped responses/tests/test_responses.py::TestMultipleWrappers::test_call_another_wrapped_function responses/tests/test_responses.py::TestMultipleWrappers::test_mock_not_leaked responses/tests/test_responses.py::TestShortcuts::test_delete responses/tests/test_responses.py::TestShortcuts::test_get responses/tests/test_responses.py::TestShortcuts::test_head responses/tests/test_responses.py::TestShortcuts::test_options responses/tests/test_responses.py::TestShortcuts::test_patch responses/tests/test_responses.py::TestShortcuts::test_post responses/tests/test_responses.py::TestShortcuts::test_put responses/tests/test_responses.py::test_reset_in_the_middle responses/tests/test_responses.py::test_redirect