/**
* Примеры использования новой системы обработки ошибок
* Этот файл демонстрирует различные сценарии использования
*/
import { useState } from 'react';
import { useErrorHandler } from '../hooks/useErrorHandler';
import RetryButton from '../components/RetryButton';
import api from '../lib/api';
/**
* Пример 1: Простая обработка ошибок в компоненте
*/
function SimpleErrorHandlingExample() {
const [data, setData] = useState(null);
const [loading, setLoading] = useState(false);
const { handleError, handleSuccess, withErrorHandler } = useErrorHandler();
// Вариант 1: Ручная обработка ошибок
const fetchDataManual = async () => {
setLoading(true);
try {
const response = await api.get('/domains-new');
setData(response.data);
handleSuccess('Данные успешно загружены');
} catch (error) {
handleError(error, { component: 'SimpleErrorHandlingExample' });
} finally {
setLoading(false);
}
};
// Вариант 2: Автоматическая обработка с withErrorHandler
const fetchDataAuto = withErrorHandler(
async () => {
setLoading(true);
const response = await api.get('/domains-new');
setData(response.data);
setLoading(false);
},
{
successMessage: 'Данные успешно загружены',
context: { component: 'SimpleErrorHandlingExample' }
}
);
return (
Пример простой обработки ошибок
{data && (
Загружено записей: {data.items?.length || 0}
)}
);
}
/**
* Пример 2: Использование RetryButton
*/
function RetryButtonExample() {
const [attempts, setAttempts] = useState(0);
const { handleError: _handleError, handleSuccess } = useErrorHandler();
const unreliableOperation = async () => {
setAttempts(prev => prev + 1);
// Симуляция операции которая иногда падает
if (Math.random() < 0.5) {
throw new Error('Случайная ошибка для демонстрации');
}
handleSuccess('Операция выполнена успешно!');
};
return (
Пример использования RetryButton
Попыток: {attempts}
Выполнить ненадежную операцию
);
}
/**
* Пример 3: Обработка различных типов ошибок
*/
function ErrorTypesExample() {
const { handleError } = useErrorHandler();
const triggerNetworkError = () => {
api.get('/nonexistent-endpoint')
.catch(error => handleError(error));
};
const triggerValidationError = () => {
api.post('/domains-new', { invalid: 'data' })
.catch(error => handleError(error));
};
const triggerTimeoutError = () => {
// Создаем запрос который точно превысит таймаут
const slowApi = api.create({ timeout: 100 });
slowApi.get('/domains-new')
.catch(error => handleError(error));
};
return (
Типы ошибок
);
}
/**
* Главный компонент с примерами
*/
function ErrorHandlingExample() {
return (
Примеры обработки ошибок
Демонстрация возможностей новой системы обработки ошибок
Особенности новой системы
- ✅ Автоматический retry для GET запросов (до 3 попыток)
- ✅ Умный retry для POST/PUT/DELETE при сетевых ошибках
- ✅ Exponential backoff с jitter для избежания thundering herd
- ✅ User-friendly сообщения вместо технических ошибок
- ✅ Детальная информация для отладки (requestId, timestamp, детали)
- ✅ Offline/Online detection с уведомлениями
- ✅ Error Boundary для ловли React ошибок рендеринга
- ✅ Типизация ошибок (Network, Timeout, Server, Client, etc.)
- ✅ Интеграция с системой уведомлений
- ✅ Логирование критичных ошибок
);
}
export default ErrorHandlingExample;