Обработка ошибок

Спецификация механизмов перехвата исключений
В серверной части на Node.js (v22 LTS) и PHP 8.3 применяются различные типы обработчиков, определённые стандартами ECMAScript 2026 и PSR-3. Для синхронного кода используется конструкция try-catch-finally, где блок catch принимает объект исключения с обязательными полями message (string) и code (int). В асинхронных цепочках (Promise) применяются методы .catch() и глобальные обработчики unhandledRejection — разница заключается в том, что .catch() перехватывает только ошибки конкретного промиса, а unhandledRejection обрабатывает исключения, не имеющие обработчика в текущем контексте выполнения. Производительность при использовании try-catch снижается на 3–8% при интенсивных вызовах (более 10 000 операций в секунду), поэтому критические участки кода (базы данных, внешние API) изолируются в отдельные функции с предварительной валидацией входных данных.
Материалы и компоненты системы логирования
Для сбора метрик об ошибках используются специализированные SDK — Sentry (версия 24.12) и LogRocket. В конфигурации Sentry для серверных приложений обязательно указывается параметр tracesSampleRate (float от 0.0 до 1.0), который определяет частоту выборки транзакций. Для сайтов с посещаемостью более 100 000 запросов в сутки рекомендуется значение 0.1. Отличие Sentry от альтернатив (например, Graylog) — интеграция source maps (файлов .map), позволяющая маппить минифицированный клиентский код на исходные строки. На стороне браузера для фиксации ресурсных ошибок (404, 503) применяется API PerformanceObserver с типом записи resource. Логи хранятся в Elasticsearch (версия 8.15) с retention-периодом 30 дней для оперативных и 90 дней для архивных копий.
Архитектурные различия: серверная и клиентская обработка
На серверной стороне (Apache/Nginx + PHP-FPM) обработка ошибок организуется через кастомные функции set_error_handler() и set_exception_handler(). В PHP по стандарту PSR-3 все исключения преобразуются в структурированный лог с уровнем error или critical. В Python (Django 5.2) используется middleware, который перехватывает HTTP 500 и возвращает JSON с полями detail, status_code, instance. На клиентской стороне в React 19 (с поддержкой Server Components) применяются Error Boundary — классовые компоненты, реализующие метод componentDidCatch(error, errorInfo). Главное отличие от серверного try-catch: Error Boundary не перехватывает ошибки в асинхронных колбэках и событиях (например, onclick), поэтому для таких случаев используется отдельный хук useErrorHandler. В Angular 17 обработка базируется на глобальном ErrorHandler, который переопределяется через провайдер APP_ERROR_HANDLER.
Стандарты качества и тестирование устойчивости
Согласно стандарту ISO 25010 (раздел Reliability), система обработки ошибок должна обеспечивать отказоустойчивость на уровне 99.9% — это означает, что ни одна необработанная ошибка не должна приводить к полному падению сервиса. Для проверки этого требования проводится нагрузочное тестирование с помощью Artillery (v2.7) с профилем chaos engineering: эмулируется отказ базы данных (MySQL 8.4), превышение лимита памяти (256 MB на процесс) и недоступность внешнего API (HTTP 503). После эмуляции измеряется время восстановления — по нормативам ITIL, оно не должно превышать 15 секунд для критических микросервисов. Дополнительно в CI/CD (GitLab CI) добавляются пайпы с флагом --error-on-unhandled-rejection, который валидирует отсутствие исключений без обработчика в тестовой среде.
Спецификации HTTP-статусов и стандарты ответов
В REST API (JSON:API по стандарту RFC 7807) тело ответа при ошибке содержит обязательное поле title (например, 'Internal Server Error') и опциональное detail с техническим описанием для администратора. Для клиентских ошибок (4xx) используется поле errors с массивом объектов, где каждый объект имеет code, source.pointer (путь к полю в запросе) и meta (например, идентификатор транзакции). Отличие от устаревшего подхода XML-RPC — полная типизация статусов. Для GraphQL (Apollo Server 4) применяется код GRAPHQL_VALIDATION_FAILED, который возвращается при нарушении схемы, в отличие от HTTP 400 — он трактуется как бизнес-ошибка, а не сетевая.
Мониторинг и качество сборки
Для анализа частотности ошибок используется Prometheus (v2.54) с метрикой http_requests_total, помеченной лейблами status_code и handler. Графики строятся в Grafana с пороговыми значениями: если количество ошибок 5xx превышает 0.1% от всех запросов в течение 5 минут, генерируется алерт через PagerDuty. На этапе сборки (Webpack 5, esbuild) все неудачные импорты модулей и ошибки компиляции выводятся в терминал с кодами ошибок Error code: MODULE_NOT_FOUND и BUILD_FAILED. Качество сборки проверяется через ESLint с плагином eslint-plugin-no-uncaught-throw, который запрещает выбрасывать необработанные исключения в Promise без catch.
Различия в реализации для хостинга
При развёртывании на shared-хостинге (cPanel, Plesk) обработка ошибок ограничена файлом .htaccess: директива ErrorDocument 500 /error.php позволяет отобразить кастомную страницу, но не логировать стек в реальном времени. В отличие от VPS (Docker + Nginx), где можно настроить логирование в Graylog через GELF-протокол (UDP 12201). Специфические для хостинга ограничения: максимальный размер лога 512 MB на аккаунт, очистка логов раз в 24 часа. Для провайдеров с LVE Manager (CloudLinux) каждый аккаунт изолирован, и ошибки памяти (out of memory) фиксируются в директории /var/log/lve-info.log с PID процесса.
Добавлено: 07.05.2026
