diff --git a/sanic/errorpages.py b/sanic/errorpages.py
index 19ccc69b..7b243ddb 100644
--- a/sanic/errorpages.py
+++ b/sanic/errorpages.py
@@ -92,8 +92,10 @@ class BaseRenderer:
             self.full
             if self.debug and not getattr(self.exception, "quiet", False)
             else self.minimal
-        )
-        return output()
+        )()
+        output.status = self.status
+        output.headers.update(self.headers)
+        return output
 
     def minimal(self) -> HTTPResponse:  # noqa
         """
@@ -125,7 +127,7 @@ class HTMLRenderer(BaseRenderer):
             request=self.request,
             exc=self.exception,
         )
-        return html(page.render(), status=self.status, headers=self.headers)
+        return html(page.render())
 
     def minimal(self) -> HTTPResponse:
         return self.full()
@@ -146,8 +148,7 @@ class TextRenderer(BaseRenderer):
                 text=self.text,
                 bar=("=" * len(self.title)),
                 body=self._generate_body(full=True),
-            ),
-            status=self.status,
+            )
         )
 
     def minimal(self) -> HTTPResponse:
@@ -157,9 +158,7 @@ class TextRenderer(BaseRenderer):
                 text=self.text,
                 bar=("=" * len(self.title)),
                 body=self._generate_body(full=False),
-            ),
-            status=self.status,
-            headers=self.headers,
+            )
         )
 
     @property
@@ -218,11 +217,11 @@ class JSONRenderer(BaseRenderer):
 
     def full(self) -> HTTPResponse:
         output = self._generate_output(full=True)
-        return json(output, status=self.status, dumps=self.dumps)
+        return json(output, dumps=self.dumps)
 
     def minimal(self) -> HTTPResponse:
         output = self._generate_output(full=False)
-        return json(output, status=self.status, dumps=self.dumps)
+        return json(output, dumps=self.dumps)
 
     def _generate_output(self, *, full):
         output = {

diff --git a/tests/test_errorpages.py b/tests/test_errorpages.py
index d2c1fc7b..a2df90b3 100644
--- a/tests/test_errorpages.py
+++ b/tests/test_errorpages.py
@@ -527,3 +527,26 @@ def test_guess_mime_logging(
     ]
 
     assert logmsg == expected
+
+
+@pytest.mark.parametrize(
+    "format,expected",
+    (
+        ("html", "text/html; charset=utf-8"),
+        ("text", "text/plain; charset=utf-8"),
+        ("json", "application/json"),
+    ),
+)
+def test_exception_header_on_renderers(app: Sanic, format, expected):
+    app.config.FALLBACK_ERROR_FORMAT = format
+
+    @app.get("/test")
+    def test(request):
+        raise SanicException(
+            "test", status_code=400, headers={"exception": "test"}
+        )
+
+    _, response = app.test_client.get("/test")
+    assert response.status == 400
+    assert response.headers.get("exception") == "test"
+    assert response.content_type == expected

Headers from Exceptions
### Is there an existing issue for this?

- [X] I have searched the existing issues

### Describe the bug

Headers set on Exception objects not carried through on all renderers

### Code snippet

```py
raise Unauthorized(
    "Auth required.",
    headers={"foo": "bar"},
)
```

### Expected Behavior

Response should have:

```
Foo: bar
```

### How do you run Sanic?

Sanic CLI

### Operating System

all

### Sanic Version

23.3

### Additional context

_No response_
tests/test_errorpages.py::test_exception_header_on_renderers[json-application/json]
tests/test_errorpages.py::test_should_return_html_valid_setting[None-text/plain; tests/test_errorpages.py::test_should_return_html_valid_setting[html-text/html; tests/test_errorpages.py::test_should_return_html_valid_setting[auto-text/plain; tests/test_errorpages.py::test_should_return_html_valid_setting[text-text/plain; tests/test_errorpages.py::test_should_return_html_valid_setting[json-application/json-Exception-500] tests/test_errorpages.py::test_should_return_html_valid_setting[json-application/json-NotFound-404] tests/test_errorpages.py::test_auto_fallback_with_data tests/test_errorpages.py::test_auto_fallback_with_content_type tests/test_errorpages.py::test_route_error_format_set_on_auto tests/test_errorpages.py::test_route_error_response_from_auto_route tests/test_errorpages.py::test_route_error_response_from_explicit_format tests/test_errorpages.py::test_unknown_fallback_format tests/test_errorpages.py::test_route_error_format_unknown tests/test_errorpages.py::test_fallback_with_content_type_html tests/test_errorpages.py::test_fallback_with_content_type_mismatch_accept tests/test_errorpages.py::test_combinations_for_auto[None-None-text/plain; tests/test_errorpages.py::test_combinations_for_auto[foo/bar-None-text/plain; tests/test_errorpages.py::test_combinations_for_auto[application/json-None-application/json] tests/test_errorpages.py::test_combinations_for_auto[application/json,text/plain-None-application/json] tests/test_errorpages.py::test_combinations_for_auto[text/plain,application/json-None-application/json] tests/test_errorpages.py::test_combinations_for_auto[text/plain,foo/bar-None-text/plain; tests/test_errorpages.py::test_combinations_for_auto[text/plain,text/html-None-text/plain; tests/test_errorpages.py::test_combinations_for_auto[*/*-foo/bar-text/plain; tests/test_errorpages.py::test_combinations_for_auto[*/*-application/json-application/json] tests/test_errorpages.py::test_combinations_for_auto[text/*,*/plain-None-text/plain; tests/test_errorpages.py::test_allow_fallback_error_format_set_main_process_start tests/test_errorpages.py::test_setting_fallback_on_config_changes_as_expected tests/test_errorpages.py::test_allow_fallback_error_format_in_config_injection tests/test_errorpages.py::test_allow_fallback_error_format_in_config_replacement tests/test_errorpages.py::test_config_fallback_before_and_after_startup tests/test_errorpages.py::test_config_fallback_using_update_dict tests/test_errorpages.py::test_config_fallback_using_update_kwarg tests/test_errorpages.py::test_config_fallback_bad_value tests/test_errorpages.py::test_guess_mime_logging[json-html-*/*-The tests/test_errorpages.py::test_guess_mime_logging[json-auto-text/html,*/*;q=0.8-The tests/test_errorpages.py::test_guess_mime_logging[json-json-text/html,*/*;q=0.8-The tests/test_errorpages.py::test_guess_mime_logging[-html-text/*,*/plain-The tests/test_errorpages.py::test_guess_mime_logging[-json-text/*,*/*-The tests/test_errorpages.py::test_guess_mime_logging[-auto-*/*,application/json;q=0.5-The tests/test_errorpages.py::test_guess_mime_logging[-auto-*/*-The tests/test_errorpages.py::test_guess_mime_logging[-auto-text/html,text/plain-The tests/test_errorpages.py::test_guess_mime_logging[-auto-text/html,text/plain;q=0.9-The tests/test_errorpages.py::test_guess_mime_logging[html-json-application/xml-No tests/test_errorpages.py::test_guess_mime_logging[--*/*-No tests/test_errorpages.py::test_exception_header_on_renderers[html-text/html; tests/test_errorpages.py::test_exception_header_on_renderers[text-text/plain;