From 8ca5d84d10d09c83d111c3572e6469c9631cfb3e Mon Sep 17 00:00:00 2001 From: Simon Holthausen Date: Thu, 25 Jun 2026 00:01:03 +0200 Subject: [PATCH 01/24] breaking: allow `handleError` to influence status code ...by returning `{ status: ..., ... }` from `handleError`. Breaking change because theoretically someone could've used this as part of `App.Error` before, and now it's kind of outside that, a reserved property on `handleError`'s return object. Closes #14442 --- .changeset/ripe-tires-chew.md | 6 ++++ documentation/docs/30-advanced/25-errors.md | 21 ++++++++++++ packages/kit/src/exports/public.d.ts | 8 +++-- .../src/runtime/app/server/remote/query.js | 16 ++++++---- packages/kit/src/runtime/client/client.js | 20 ++++++++---- packages/kit/src/runtime/server/data/index.js | 21 +++++++----- .../kit/src/runtime/server/page/actions.js | 22 +++++++------ packages/kit/src/runtime/server/page/index.js | 2 +- .../kit/src/runtime/server/page/render.js | 2 +- .../runtime/server/page/respond_with_error.js | 14 ++++---- packages/kit/src/runtime/server/remote.js | 28 ++++++++-------- packages/kit/src/runtime/server/utils.js | 2 +- packages/kit/src/types/internal.d.ts | 2 +- packages/kit/src/utils/error.js | 14 ++++++-- packages/kit/src/utils/error.spec.js | 32 +++++++++++++++++++ .../kit/test/apps/basics/src/hooks.server.js | 7 ++++ .../errors/handle-error-status/+page.js | 4 +++ .../apps/basics/test/cross-platform/test.js | 10 ++++++ packages/kit/types/index.d.ts | 8 +++-- 19 files changed, 177 insertions(+), 62 deletions(-) create mode 100644 .changeset/ripe-tires-chew.md create mode 100644 packages/kit/src/utils/error.spec.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/handle-error-status/+page.js diff --git a/.changeset/ripe-tires-chew.md b/.changeset/ripe-tires-chew.md new file mode 100644 index 000000000000..17a8c85a9fd4 --- /dev/null +++ b/.changeset/ripe-tires-chew.md @@ -0,0 +1,6 @@ +--- +"@sveltejs/kit": major +--- + +breaking: allow `handleError` to influence status code + \ No newline at end of file diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index 95538d279afe..c81d1ab57810 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -100,6 +100,27 @@ By default, unexpected errors are printed to the console (or, in production, you Unexpected errors will go through the [`handleError`](hooks#Shared-hooks-handleError) hook, where you can add your own error handling — for example, sending errors to a reporting service, or returning a custom error object which becomes `page.error`. +You can override the HTTP status code used in the response by returning a `status` property: + +```js +/// file: src/hooks.server.js +// Assuming you have this ... +class NotFound extends Error {} + +/** @type {import('./$types').HandleServerError} */ +export function handleError({ error, event, status, message }) { + // ... you can do this + if (error instanceof NotFound) { + return { + status: 404, + message: 'Not found' + }; + } + + return { message: 'Something went wrong' }; +} +``` + ## Rendering errors Ordinarily, if an error happens during server-side rendering (for example inside a component's `