Error Boundaries — это механизм обработки ошибок в компонентах веб-приложений, позволяющий предотвратить полный сбой интерфейса при возникновении исключений в конкретных компонентах. В SkateJS, как и в других современных фронтенд-фреймворках, они используются для локализации ошибок и предоставления резервного UI.
Error Boundary — это компонент, который перехватывает ошибки, возникающие в его дочерних компонентах, в методах жизненного цикла, рендеринге или пользовательских событиях. Когда ошибка обнаружена, Error Boundary:
В SkateJS Error Boundary реализуется через наследование от базового
класса SkateElement с переопределением специальных
методов:
import { component, h, props } from 'skatejs';
class MyErrorBoundary extends HTMLElement {
static props = {
fallback: props.string
};
constructor() {
super();
this.hasError = false;
this.errorMessage = '';
}
connectedCallback() {
if (!this.shadowRoot) {
this.attachShadow({ mode: 'open' });
}
this.render();
}
render() {
if (this.hasError) {
this.shadowRoot.innerHTML = `<div class="error">${this.errorMessage || this.fallback}</div>`;
} else {
// Обычно здесь вызывается слот для дочерних компонентов
this.shadowRoot.innerHTML = `<slot></slot>`;
}
}
// Метод для перехвата ошибок в дочерних компонентах
errorCaptured(error) {
this.hasError = true;
this.errorMessage = error.message;
this.render();
console.error('ErrorBoundary caught:', error);
return false; // предотвращает дальнейшее распространение
}
}
customElements.define('my-error-boundary', MyErrorBoundary);
Ключевые моменты реализации:
hasError хранит состояние ошибки.errorCaptured вызывается автоматически, если
дочерний компонент выбрасывает исключение.render динамически отображает либо содержимое слота,
либо резервный интерфейс.Error Boundary оборачивает любые компоненты, которые потенциально могут вызвать ошибки:
<my-error-boundary fallback="Произошла ошибка в компоненте">
<some-risky-component></some-risky-component>
</my-error-boundary>
Если some-risky-component выбросит ошибку, пользователь
увидит сообщение из fallback, а не сломанный интерфейс.
SkateJS не предоставляет встроенного глобального логгера ошибок, поэтому рекомендуется интегрировать Error Boundary с внешними сервисами мониторинга:
errorCaptured(error) {
this.hasError = true;
this.errorMessage = error.message;
this.render();
// Отправка данных в сервис мониторинга
sendErrorToService(error, { component: 'MyErrorBoundary' });
return false;
}
Это позволяет собирать статистику по сбоям и оперативно реагировать на критические ошибки.
componentDidCatch. Метод errorCaptured
реализуется вручную для каждого Boundary.<my-error-boundary fallback="Ошибка верхнего уровня">
<my-error-boundary fallback="Ошибка внутреннего компонента">
<risky-child></risky-child>
</my-error-boundary>
</my-error-boundary>
В этом случае:
risky-child сначала будет перехвачена
внутренним Boundary.Использование Error Boundaries в SkateJS обеспечивает:
Сбалансированное применение Error Boundaries позволяет строить надежные и безопасные веб-приложения, избегая полного разрушения интерфейса при локальных сбоях компонентов.