Каждый разработчик, работающий с асинхронным кодом в JavaScript, рано или поздно сталкивается с ошибками, которые «проглатываются» без логов, неожиданными падениями приложения или неконтролируемыми состояниями в цепочках промисов. Эти проблемы особенно коварны в продакшен-среде, где их сложно воспроизвести и отладить. Разберемся, как построить надежную систему обработки ошибок — от базовых паттернов до архитектурных решений.
Почему ошибки «исчезают»?
Рассмотрим типичный сценарий с fetch
:
fetch('/api/data')
.then(response => response.json())
.then(data => updateUI(data));
Если сервер вернет 500 ошибку или JSON окажется некорректным, исключение может остаться неперехваченным. В браузере это приведет к ошибке в консоли, но в Node.js процесс вообще завершится с кодом 1. Решение кажется очевидным — добавить .catch()
, но на практике разработчики часто забывают обрабатывать ошибки в цепочках промисов или используют async/await
без try/catch
.