<svelte:boundary>
<svelte:boundary onerror={handler}>...</svelte:boundary>
Границы позволяют «отделить» части вашего приложения, чтобы вы могли:
- отображать интерфейс, который должен показываться во время первоначального выполнения
await
-выражений - обрабатывать ошибки, возникающие при рендеринге или выполнении эффектов, и предоставлять интерфейс для отображения при возникновении ошибки
Если граница обрабатывает ошибку (с помощью сниппета failed
или обработчика onerror
, или обоих), её текущее содержимое будет удалено.
Параметры
Заголовок раздела «Параметры»Чтобы граница выполняла свою функцию, должен быть предоставлен хотя бы один из следующих элементов.
pending
Заголовок раздела «pending»Начиная со Svelte 5.36, границы со сниппетом pending
могут содержать выражения await
. Этот сниппет будет отображаться при создании границы и останется видимым, пока все выражения await
внутри границы не будут выполнены (демонстрация):
<svelte:boundary> <p>{await delayed('привет!')}</p>
{#snippet pending()} <p>загрузка...</p> {/snippet}</svelte:boundary>
Если предусмотрен сниппет failed
, он будет отображаться при возникновении ошибки внутри границы, получая доступ к объекту error
и функции reset
для повторного создания содержимого (демонстрация):
<svelte:boundary> <FlakyComponent />
{#snippet failed(error, reset)} <button onclick={reset}>упс! попробовать ещё раз</button> {/snippet}</svelte:boundary>
onerror
Заголовок раздела «onerror»Если предоставлена функция onerror
, она будет вызвана с теми же двумя аргументами: error
и reset
. Это полезно для отслеживания ошибок с помощью сервиса отчётов об ошибках…
<svelte:boundary onerror={(e) => report(e)}> ...</svelte:boundary>
…или для использования error
и reset
за пределами самой границы:
<script> let error = $state(null); let reset = $state(() => {});
function onerror(e, r) { error = e; reset = r; }</script>
<svelte:boundary {onerror}> <FlakyComponent /></svelte:boundary>
{#if error} <button onclick={() => { error = null; reset(); }}> упс! попробовать ещё раз </button>{/if}
Если ошибка происходит внутри функции onerror
(или если вы повторно выбрасываете ошибку), она будет обработана родительской границей, если таковая существует.