Обработка ошибок в приложениях на SvelteKit требует понимания особенностей фреймворка и взаимодействия с библиотеками пользовательского интерфейса. Ошибки могут возникать как на уровне серверных маршрутов, так и в компонентах, поэтому подход должен быть комплексным.
try-catch в компонентахВ SvelteKit UI библиотеках компоненты часто получают данные через
асинхронные запросы или пропсы. Для безопасной обработки ошибок
применяется конструкция try-catch:
<script>
import { onMount } from 'svelte';
import { fetchData } from '../api/data.js';
let data;
let error = null;
onMount(async () => {
try {
data = await fetchData();
} catch (err) {
error = err.message;
}
});
</script>
{#if error}
<div class="error">{error}</div>
{:else if data}
<div class="content">{data}</div>
{/if}
Ключевой момент: всегда сохранять состояние ошибки в отдельной переменной, чтобы не ломать реактивность компонента.
load функцияхSvelteKit использует load функции для предварительной
загрузки данных на маршрутах. Ошибки, возникающие в этих функциях, можно
обрабатывать с помощью встроенных объектов error и
redirect.
// src/routes/[id]/+page.js
import { error } from '@sveltejs/kit';
export async function load({ params, fetch }) {
try {
const res = await fetch(`/api/items/${params.id}`);
if (!res.ok) throw new Error('Не удалось загрузить данные');
const item = await res.json();
return { item };
} catch (err) {
throw error(500, err.message);
}
}
Особенности:
throw error(status, message) позволяет
SvelteKit автоматически рендерить страницу ошибки.404, 401,
500) можно маршрутизировать на соответствующие
страницы.Для централизованной обработки ошибок на уровне приложения
применяется handleError в
src/hooks.server.js:
export function handleError({ error, event }) {
console.error('Произошла ошибка:', error);
return {
message: 'Произошла внутренняя ошибка сервера',
code: error.code ?? 'UNKNOWN'
};
}
Преимущества:
SvelteKit UI libs, такие как svelte-material-ui,
sveltestrap или shadcn-ui, предоставляют
компоненты для отображения ошибок:
Пример с использованием Toast уведомления:
<script>
import { toast } from 'svelte-french-toast';
async function submitForm(formData) {
try {
const res = await fetch('/api/submit', { method: 'POST', body: formData });
if (!res.ok) throw new Error('Ошибка отправки формы');
toast.success('Форма успешно отправлена');
} catch (err) {
toast.error(err.message);
}
}
</script>
Рекомендация: комбинировать реактивное состояние ошибки с визуальными компонентами для улучшения UX.
Формы — частая точка возникновения ошибок. SvelteKit UI библиотеки поддерживают:
required,
pattern, кастомные функции).<script>
let email = '';
let emailError = '';
async function validateEmail() {
try {
const res = await fetch(`/api/validate-email?email=${email}`);
const { valid } = await res.json();
if (!valid) emailError = 'Email уже занят';
else emailError = '';
} catch {
emailError = 'Ошибка проверки email';
}
}
</script>
<input type="email" bind:value={email} on:blur={validateEmail} />
{#if emailError}
<span class="error">{emailError}</span>
{/if}
Принцип: ошибки должны быть максимально локализованы, чтобы не мешать остальному компоненту.
{#if error}
<div class="error">
{error}
<button on:click={reload}>Попробовать снова</button>
</div>
{:else}
<DataDisplay {data} />
{/if}
reload может повторно вызывать асинхронную функцию
получения данных.try-catch, load,
handleError и UI компонентов позволяет контролировать все
уровни.Эффективная обработка ошибок в SvelteKit повышает надежность приложений и улучшает пользовательский опыт, особенно при взаимодействии с асинхронными данными и внешними API.