breaking: pass all errors through handleError, update the function contract - #16664
Merged
elliott-with-the-longest-name-on-github merged 22 commits intoAug 10, 2026
Merged
Conversation
|
Install the latest version of pnpm add https://pkg.svelte.dev/@sveltejs/kit/c/0841f3722b7ffd0c2658ed729af4824e89d1d025Open in |
🦋 Changeset detectedLatest commit: 0841f37 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
Rich-Harris
reviewed
Aug 5, 2026
Rich-Harris
reviewed
Aug 5, 2026
Rich-Harris
reviewed
Aug 5, 2026
Rich-Harris
reviewed
Aug 5, 2026
Comment on lines
+191
to
+197
| Alongside the `event`, the hook receives a `kind` discriminant that tells you where the error came from, and the `error` itself: | ||
|
|
||
| | `kind` | thrown by | `error` | defaults to | | ||
| | -------------- | ----------------------------------- | -------------------------------------------------------------------- | -------------------------------------------- | | ||
| | `'expected'` | [`error(...)`](@sveltejs-kit#error) | the error body, which matches [`App.Error`](types#Error) | the error body itself | | ||
| | `'unexpected'` | your code, or code it calls | the thrown value, which may contain information unsafe to expose | `{ status: 500, message: 'Internal Error' }` | | ||
| | `'framework'` | SvelteKit — 404s, 405s, 413s... | `{ status, message }`, where `message` is safe text like `Not Found` | that same `{ status, message }` | |
Member
Contributor
Author
There was a problem hiding this comment.
Yeah it's kinda weird, I wonder if there's a way to get the header formatting better...
Rich-Harris
reviewed
Aug 5, 2026
Rich-Harris
reviewed
Aug 5, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Member
|
looks like some tests need updating |
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
Rich-Harris
reviewed
Aug 6, 2026
elliott-with-the-longest-name-on-github
force-pushed
the
elliott/update-handle-error
branch
2 times, most recently
from
August 7, 2026 13:35
cd174e9 to
c75edb4
Compare
Rich-Harris
reviewed
Aug 8, 2026
Rich-Harris
reviewed
Aug 8, 2026
Rich-Harris
reviewed
Aug 8, 2026
Rich-Harris
left a comment
Member
There was a problem hiding this comment.
LGTM aside from the naming
Rich-Harris
reviewed
Aug 10, 2026
| } | ||
| ``` | ||
|
|
||
| The object you return becomes the body of an [expected error](errors#Expected-errors), which then passes through [`handleError`](hooks#handleError) with `kind: 'app'`. |
Member
There was a problem hiding this comment.
we should probably update the headings on this page to 'App errors' and 'Unknown errors'
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
Co-authored-by: Rich Harris <richard.a.harris@gmail.com>
elliott-with-the-longest-name-on-github
force-pushed
the
elliott/update-handle-error
branch
from
August 10, 2026 21:06
1b1a2e5 to
0841f37
Compare
elliott-with-the-longest-name-on-github
merged commit Aug 10, 2026
031ac69
into
version-3
26 of 27 checks passed
elliott-with-the-longest-name-on-github
deleted the
elliott/update-handle-error
branch
August 10, 2026 21:32
teemingc
added a commit
that referenced
this pull request
Aug 11, 2026
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to version-3, this PR will be updated.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ `version-3` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run `changeset pre exit` on `version-3`.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ # Releases ## @sveltejs/kit@3.0.0-next.19 ### Major Changes - breaking: move `defineParams` and associated types to `@sveltejs/kit/params` ([#16716](#16716)) - breaking: run all errors through the `handleError` hook ([#16664](#16664)) - breaking: move `Page`, `ReadonlyURL` and `ReadonlyURLSearchParams` from `@sveltejs/kit` to `$app/state` ([#16694](#16694)) - breaking: move `BeforeNavigate`, `OnNavigate`, `AfterNavigate`, `Navigation`, `NavigationTarget`, `NavigationType`, `GotoOptions` and the `Navigation*` variant types from `@sveltejs/kit` to `$app/navigation` ([#16694](#16694)) - breaking: move `ActionResult` and `SubmitFunction` from `@sveltejs/kit` to `$app/forms` ([#16694](#16694)) - breaking: remove `handleValidationError` and pass remote function validation errors to `handleError` with `kind: 'validation'` ([#16672](#16672)) ### Minor Changes - feat: ignore files with + prefix if they contain test/spec/stories ([#16715](#16715)) ### Patch Changes - fix: rebuild the dev manifest when route files disappear during an incremental update ([#16643](#16643)) - fix: externalize `@opentelemetry/api` to prevent bundler chunk colocation between `instrumentation.server.js` and application code ([#16302](#16302)) - fix: surface prerender errors during development ([#16507](#16507)) ## @sveltejs/adapter-node@6.0.0-next.9 ### Patch Changes - fix: externalize `@opentelemetry/api` to prevent bundler chunk colocation between `instrumentation.server.js` and application code ([#16302](#16302)) - Updated dependencies [[`04f9ab4`](04f9ab4), [`1e198bd`](1e198bd), [`813726d`](813726d), [`a115a7b`](a115a7b), [`031ac69`](031ac69), [`dc7442c`](dc7442c), [`19c4478`](19c4478), [`dc7442c`](dc7442c), [`dc7442c`](dc7442c), [`0b3e2b3`](0b3e2b3)]: - @sveltejs/kit@3.0.0-next.19 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Tee Ming <chewteeming01@gmail.com>
teemingc
pushed a commit
that referenced
this pull request
Aug 11, 2026
This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to version-3, this PR will be updated.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ `version-3` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run `changeset pre exit` on `version-3`.⚠️ ⚠️ ⚠️ ⚠️ ⚠️ ⚠️ # Releases ## @sveltejs/kit@3.0.0-next.19 ### Major Changes - breaking: move `defineParams` and associated types to `@sveltejs/kit/params` ([#16716](#16716)) - breaking: run all errors through the `handleError` hook ([#16664](#16664)) - breaking: move `Page`, `ReadonlyURL` and `ReadonlyURLSearchParams` from `@sveltejs/kit` to `$app/state` ([#16694](#16694)) - breaking: move `BeforeNavigate`, `OnNavigate`, `AfterNavigate`, `Navigation`, `NavigationTarget`, `NavigationType`, `GotoOptions` and the `Navigation*` variant types from `@sveltejs/kit` to `$app/navigation` ([#16694](#16694)) - breaking: move `ActionResult` and `SubmitFunction` from `@sveltejs/kit` to `$app/forms` ([#16694](#16694)) - breaking: remove `handleValidationError` and pass remote function validation errors to `handleError` with `kind: 'validation'` ([#16672](#16672)) ### Minor Changes - feat: ignore files with + prefix if they contain test/spec/stories ([#16715](#16715)) ### Patch Changes - fix: rebuild the dev manifest when route files disappear during an incremental update ([#16643](#16643)) - fix: externalize `@opentelemetry/api` to prevent bundler chunk colocation between `instrumentation.server.js` and application code ([#16302](#16302)) - fix: surface prerender errors during development ([#16507](#16507)) - fix: adjust error overload for optional `App.Error` parameters ([#16725](#16725)) ## @sveltejs/adapter-node@6.0.0-next.9 ### Patch Changes - fix: externalize `@opentelemetry/api` to prevent bundler chunk colocation between `instrumentation.server.js` and application code ([#16302](#16302)) - Updated dependencies [[`04f9ab4`](04f9ab4), [`1e198bd`](1e198bd), [`813726d`](813726d), [`a115a7b`](a115a7b), [`031ac69`](031ac69), [`dc7442c`](dc7442c), [`19c4478`](19c4478), [`dc7442c`](dc7442c), [`dc7442c`](dc7442c), [`0b3e2b3`](0b3e2b3), [`c5d0ce2`](c5d0ce2)]: - @sveltejs/kit@3.0.0-next.19 Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Open
6 tasks
elliott-with-the-longest-name-on-github
pushed a commit
that referenced
this pull request
Aug 22, 2026
`packages/kit/test/apps/basics/test/setup.js` changes directory to `src/routes/routing` to create the route symlink, then deletes `test/errors.jsonl` with a path relative to the app root. On non-Windows the `chdir` happens first, so the delete resolves under `src/routes/routing/` and the log written by `hooks.server.js` is never cleared between runs on Linux and macOS. `read_errors` in `test/utils.js` picks the last record matching a path, so a stale record from an earlier run can satisfy an assertion. The `rmSync` came in with #16664; the `chdir` block predates it. Node resolves a symlink's target relative to the link's own directory, so the symlink can be created from the app root. Dropping the `chdir` keeps every path in the script relative to the same place, so line order can't matter again.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

closes #16413
Two substantive changes:
handleErrornow handles all errorserrorhelperThese are passed into
handleErroras akind, errorunion, where the type oferrordepends on thekind:unknownApp.Error{ message: string, status: string }handleErrormust returnApp.Error, thoughstatusandmessageare optional (the framework will generate them automatically if you don't provide them). So the following is valid for just logging:But you can also: