错误是软件开发不可避免的事实。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
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)