SvelteKit 最新中文文档教程(14)—— 错误处理

news/2025/4/1 19:58:29/文章来源:https://www.cnblogs.com/yayujs/p/18799223

前言

Svelte,一个语法简洁、入门容易,面向未来的前端框架。

从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1

image.png

Svelte 以其独特的编译时优化机制著称,具有轻量级高性能易上手等特性,非常适合构建轻量级 Web 项目

为了帮助大家学习 Svelte,我同时搭建了 Svelte 最新的中文文档站点。

如果需要进阶学习,也可以入手我的小册《Svelte 开发指南》,语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。

错误处理

错误是软件开发中不可避免的事实。SvelteKit 根据错误发生的位置、错误类型以及传入请求的性质,采用不同的方式处理错误。

错误对象

SvelteKit 区分预期错误和意外错误,默认情况下这两种错误都表示为简单的 { message: string } 对象。

您可以添加额外的属性,比如 code 或跟踪 id,如下面的示例所示。(使用 TypeScript 时,这需要您重新定义 Error 类型,如 类型安全 中所述)。

预期错误

预期错误是使用从 @sveltejs/kit 导入的 error 辅助函数创建的错误:

/// 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: '未找到'});}return { post };
}

这会抛出一个异常,SvelteKit 会捕获该异常,并将响应状态码设置为 404,并渲染一个 +error.svelte 组件,其中 page.error 是一个对象,提供给 error(...) 的第二个参数。

<!--- file: src/routes/+error.svelte --->
<script>import { page } from '$app/state';
</script><h1>{page.error.message}</h1>

[!LEGACY] > $app/state 是在 SvelteKit 2.12 中添加的。如果您使用的是早期版本或正在使用 Svelte 4,请使用 $app/stores 代替。

如果需要,您可以向错误对象添加额外的属性...

import { error } from '@sveltejs/kit';declare global {namespace App {interface Error {message: string;code: string;}}
}// ---cut---
error(404, {message: '未找到',+++code: 'NOT_FOUND'+++
});

...否则,为了方便起见,您可以将字符串作为第二个参数传递:

import { error } from '@sveltejs/kit';
// ---cut---
---error(404, { message: '未找到' });---
+++error(404, '未找到');+++

[!NOTE] 在 SvelteKit 1.x 中,您必须自己 throw 这个 error

意外错误

意外错误是处理请求时发生的任何其他异常。由于这些错误可能包含敏感信息,意外错误消息和堆栈跟踪不会暴露给用户。

默认情况下,意外错误会打印到控制台(或在生产环境中打印到服务端日志),而暴露给用户的错误具有通用的形状:

{ "message": "内部错误" }

意外错误将通过 handleError hook 处理,在那里您可以添加自己的错误处理逻辑 — 例如,将错误发送到报告服务,或返回一个自定义错误对象,该对象将成为 $page.error

响应

如果错误发生在 handle+server.js 请求处理程序内部,SvelteKit 将根据请求的 Accept 头响应一个回退错误页面或错误对象的 JSON 表示。

您可以通过添加 src/error.html 文件来自定义回退错误页面:

<!doctype html>
<html lang="en"><head><meta charset="utf-8" /><title>%sveltekit.error.message%</title></head><body><h1>我的自定义错误页面</h1><p>状态:%sveltekit.status%</p><p>消息:%sveltekit.error.message%</p></body>
</html>

SvelteKit 将用相应的值替换 %sveltekit.status%%sveltekit.error.message%

如果错误发生在渲染页面时的 load 函数内部,SvelteKit 将渲染最接近错误发生位置的 +error.svelte 组件。如果错误发生在 +layout(.server).js 中的 load 函数内部,最近的错误边界是该布局之上的 +error.svelte 文件(不是在它旁边)。

例外情况是当错误发生在根 +layout.js+layout.server.js 内部时,因为根布局通常会包含 +error.svelte 组件。在这种情况下,SvelteKit 使用回退错误页面。

类型安全

如果您使用 TypeScript 并需要自定义错误的形状,您可以通过在您的应用程序中声明一个 App.Error 接口来实现(按照惯例,在 src/app.d.ts 中,尽管它可以存在于 TypeScript 可以"看到"的任何地方):

/// file: src/app.d.ts
declare global {namespace App {interface Error {
+++			code: string;id: string;+++}}
}export {};

此接口始终包含 message: string 属性。

进一步阅读

  • 教程:错误和重定向
  • 教程:Hooks

Svelte 中文文档

点击查看中文文档:SvelteKit 错误处理

系统学习 Svelte,欢迎入手小册《Svelte 开发指南》。语法篇、实战篇、原理篇三大篇章带你系统掌握 Svelte!

此外我还写过 JavaScript 系列、TypeScript 系列、React 系列、Next.js 系列、冴羽答读者问等 14 个系列文章, 全系列文章目录:https://github.com/mqyqingfeng/Blog

欢迎围观我的“网页版朋友圈”、加入“冴羽·成长陪伴社群”,踏上“前端大佬成长之路”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907489.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行网点加钞间作业人数异常报警系统

银行网点加钞间作业人数异常报警系统检测银行网点加钞间区域内作业人数,对超过设定人数阈值,进行预警。加钞间少于2人进行报警,规范员工操作,落实银行制度。自助环境区域、防护舱内区域重点关注大于等于2人,预防案件发生。通过人脸识别比对系统,对加钞间非授权人员进行检…

RAGFlow部署

参照https://eogee.com/article/detail/17进行 其中主要就是放开ragflow/docker/.env文件中的RAGFLOW_IMAGE华为云镜像地址 修改ragflow/docker/docker-compose.yml文件中的端口 Q:访问网页注册登录无反应 打开控制台看是报了502的错误 A:确保mysql,redis,minio,es等先启动,然…

多模态AI核心技术:CLIP与SigLIP技术原理与应用进展

近年来,人工智能领域在多模态表示学习方面取得了显著进展,这类模型通过统一框架理解并整合不同数据类型间的语义信息,特别是图像与文本之间的关联性。在此领域具有里程碑意义的模型包括OpenAI提出的CLIP(Contrastive Language-Image Pre-training,对比语言-图像预训练)和…

在岗人数分析报警摄像机

在岗人数分析报警摄像机采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确地对场景中人员数量的分析统计预警。在岗人数分析报警摄像机是可以实时分析一个指定值班域内的人员数量,当所监视区域的值班人员数量少于设定的阀值时摄像机输出开关量信号,可…

工厂车间在岗人数分析预警系统

工厂车间在岗人数分析预警系统基于AI人工智能分析技术,将车间生产区域员工在岗人数进行管理预警,可以实现对厂区的全面覆盖,全天候保障厂区生产安全,建立完善长效的安全生产运营机制。在岗人数分析预警系统嵌入AI人员离岗分析算法,可对车间生产区域内人员的数量进行精确分…

虚拟机vmware16 安装centos8.5 你全流程和详细配置

因为centos8.5 不能使用他自己的源,所以新装的系统默认不能安装软件,需要做一些配置 其二。部份虚拟机新装的不能连网,所以我将今天安装的流程记录以下,如果正好有别人需要,可以看一下我安装的流程第一步,如果不能上网配置。先装虚拟机配成桥接试试,可能是默认上nat 那…

FaceBook OAuth2登录配置

应用必须上架才能正式使用FaceBook developers 后台添加应用配置https://developers.facebook.com 创建应用,應用程式設定 -》 添加IOS包名,添加安卓包名, 應用程式編號,應用程式密鑰 对应服务端配置: FacebookLoginAppId FacebookLoginAppSecret 首次登录访问提示错误,错…

itdog-ping

地址 https://www.itdog.cn/ping/ 概览作者:mohistH 出处:https://www.cnblogs.com/pandamohist/ 本文版权归作者和博客园共有,谢绝一切形式的转载,否则将追究法律责任。

某客户RAID出现Multi-bit ECC error错误

某客户反馈,BMC带外有Major级别的告警,告警内容如下可以看出SEL指向RAID卡,产生告警时间为2024年11月14日。检查RAID卡日志,找2024年11月14号发生的事件。从RAID卡事件可以看出来RAID卡从2024年11月9号到2024年11月14号,5天内并没有记录任何日志(如下图)一直到2024年11月…

直播软件怎么开发,Redis触发扩容的两种情况

直播软件怎么开发,Redis触发扩容的两种情况1、如果没有fork子进程在执行RDB或者AOF的持久化,一旦满足ht[0].used >= ht[0].size,此时触发扩容;2、如果有fork子进程在执行RDB或者AOF的持久化时,则需要满足ht[0].used > 5 * ht[0].size,此时触发扩容。下面将结合源码…

怎么快速干净拆焊直插元件的方法成都承接电路板设计

我处提供优质的单片机、PLC、电路板、控制器/箱、仪器仪表、机电设备或系统、自动化、工控、传感、数据采集、自控系统、控制系统、物联网、电子产品、软件、APP开发设计定制服务(业务www点yonko-tech点com),在做项目的时候,拆除电路板上的元件也是有的事情,拆元件说难不难…

flutter:用http库下载文件

一,安装第三方库 地址: https://pub.dev/packages/http 编辑pubspec.yaml: dependencies:flutter:sdk: flutterpath_provider: ^2.1.5http: ^1.3.0 然后点击 pub get 二,代码: import package:flutter/material.dart; import package:http/http.dart show get; import packa…