错误是软件开发不可避免的事实。SvelteKit 根据错误发生的位置、错误类型以及请求的性质来处理错误。 ## 错误对象 SvelteKit 区分预期错误和意外错误,这两者默认都表示为简单的 `{ message: string }` 对象。 您可以添加额外的属性,例如一个 `代码` 或一个跟踪的 `id`,如下面的示例所示。(当使用 TypeScript 时,这需要您按照 [类型安全](errors#Type-safety) 的描述重新定义 `Error` 类型)。 ## 预期错误 一个*预期的*错误是指使用从`@sveltejs/kit`导入的`error`辅助函数创建的错误:[`错误`](@sveltejs-kit#error): ```js /// file: src/routes/blog/[slug]/+page.server.js // @filename: ambient.d.ts declare module '$lib/server/database' { export function getPost(slug: string): Promise<{ title: string, content: string } | undefined> } // @filename: index.js // ---cut--- import { error } from '@sveltejs/kit'; import * as db from '$lib/server/database'; /** @type {import('./$types').PageServerLoad} */ export async function load({ params }) { const post = await db.getPost(params.slug); if (!post) { error(404, { message: 'Not found' }); } return { post }; } ``` 这会抛出一个异常,SvelteKit 会捕获它,导致它将响应状态码设置为 404,并渲染一个[`+error.svelte`](routing#error)组件,其中`page.error`是作为第二个参数提供给`error(...)`的对象。 ```svelte

{page.error.message}

``` > \[!旧版\] `$app/state` 在 SvelteKit 2.12 中被添加。如果您使用的是更早的版本或使用 Svelte 4,请使用 `$app/stores` 代替。 您可以根据需要向错误对象添加额外的属性... ```js // @filename: ambient.d.ts declare global { namespace App { interface Error { message: string; code: string; } } } export {} // @filename: index.js import { error } from '@sveltejs/kit'; // ---cut--- error(404, { message: 'Not found', +++code: 'NOT_FOUND'+++ }); ``` ...否则,为了方便,您可以将字符串作为第二个参数传递: ```js import { error } from '@sveltejs/kit'; // ---cut--- ---error(404, { message: 'Not found' });--- +++error(404, 'Not found');+++ ``` > \[!注意\] [在 SvelteKit 1.x 中](migrating-to-sveltekit-2#redirect-and-error-are-no-longer-thrown-by-you)您必须 `抛出` `错误` 自己 ## 意外错误 一个 *意外* 错误是在处理请求时发生的任何其他异常。由于这些可能包含敏感信息,意外错误消息和堆栈跟踪不会向用户公开。 默认情况下,意外错误会被打印到控制台(或者在生产环境中,你的服务器日志中),而暴露给用户的错误具有通用的形状: ```json { "message": "Internal Error" } ``` 意外错误将通过 [`handleError`](hooks#Shared-hooks-handleError) 钩子进行处理,您可以在其中添加自己的错误处理——例如,将错误发送到报告服务,或者返回一个自定义的错误对象,该对象变为 `$page.error`。 ## 响应 如果 `handle` 内部或 [`+server.js`](routing#server) 请求处理器内部发生错误,SvelteKit 将根据请求的 `Accept` 头部信息,以降级错误页面或错误对象的 JSON 表示形式进行响应。 您可以通过添加一个 `src/error.html` 文件来自定义回退错误页面: ```html %sveltekit.error.message%

My custom error page

Status: %sveltekit.status%

Message: %sveltekit.error.message%

``` SvelteKit 将用相应的值替换`%sveltekit.status%`和`%sveltekit.error.message%`。 如果错误发生在渲染页面时 `load` 函数内部,SvelteKit 将渲染错误发生位置最近的 [`+error.svelte`](routing#error) 组件。如果错误发生在 `+layout(.server).js` 中的 `load` 函数内部,最近的错误边界在树中是一个位于该布局 *上方* 的 `+error.svelte` 文件(而不是紧挨着它)。 异常情况发生在根 `+layout.js` 或 `+layout.server.js` 内部错误时,因为根布局通常会 *包含* `+error.svelte` 组件。在这种情况下,SvelteKit 使用备用错误页面。 ## 类型安全 如果您使用 TypeScript 并且需要自定义错误形状,您可以通过在您的应用中声明一个`App.Error`接口来实现(按照惯例,在`src/app.d.ts`中,尽管它可以存在于 TypeScript 可以“看到”的任何地方): ```ts /// file: src/app.d.ts declare global { namespace App { interface Error { +++ code: string; id: string;+++ } } } export {}; ``` 这个接口始终包含一个 `message: string` 属性。 ## 进一步阅读 * [ 教程:错误和重定向](/tutorial/kit/error-basics) * [ 教程:钩子](/tutorial/kit/handle)