← Назад к вопросам

Как отследить что приложение не работает в каком-либо браузере?

1.7 Middle🔥 201 комментариев
#Браузер и сетевые технологии

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Отслеживание ошибок в браузере

Существует множество способов обнаружить проблемы в приложении. Разберём от самых простых до продвинутых методов.

Консоль браузера (DevTools)

Это первое место, где ищут ошибки. Откройте DevTools (F12 или Ctrl+Shift+I):

// Ошибки попадают в вкладку Console
console.error('Ошибка:', error);
console.warn('Предупреждение:', warning);
console.log('Информация:', info);

// Отслеживание необработанных ошибок
window.addEventListener('error', (event) => {
  console.error('Критическая ошибка:', event.error);
  console.error('Файл:', event.filename);
  console.error('Строка:', event.lineno);
});

// Отслеживание необработанных Promise ошибок
window.addEventListener('unhandledrejection', (event) => {
  console.error('Необработанный Promise:', event.reason);
});

Встроенные инструменты браузера

Google Chrome/Edge Developer Tools:

  • вкладка Console — все js ошибки
  • вкладка Sources — отладка кода, точки останова
  • вкладка Network — HTTP запросы и их ошибки
  • вкладка Performance — медленный код
  • вкладка Application — localStorage, cookies

Firefox DevTools:

  • Inspector — проверка HTML/CSS
  • Console — ошибки JavaScript
  • Debugger — отладка с точками останова
  • Performance — анализ производительности

Программное отслеживание ошибок

// Перехватить все ошибки в приложении
window.addEventListener('error', (event) => {
  const error = {
    message: event.message,
    filename: event.filename,
    lineno: event.lineno,
    colno: event.colno,
    error: event.error ? event.error.stack : null
  };

  // Отправить на сервер для логирования
  sendErrorToServer(error);

  // Или вывести пользователю
  showErrorNotification(event.message);
});

function sendErrorToServer(error) {
  fetch('/api/errors', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      timestamp: new Date().toISOString(),
      userAgent: navigator.userAgent,
      url: window.location.href,
      ...error
    })
  }).catch(err => console.error('Ошибка отправки лога:', err));
}

Try-Catch для синхронного кода

try {
  const data = JSON.parse(response);
  processData(data);
} catch (error) {
  console.error('Ошибка парсинга JSON:', error.message);
  showUserMessage('Ошибка: некорректные данные');
}

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

// Способ 1: .catch()
fetchUserData()
  .then(data => processData(data))
  .catch(error => {
    console.error('Ошибка загрузки:', error);
    showErrorNotification('Не удалось загрузить данные');
  });

// Способ 2: async/await с try-catch
async function loadAndProcess() {
  try {
    const data = await fetchUserData();
    const processed = await processData(data);
    return processed;
  } catch (error) {
    console.error('Ошибка в async функции:', error.message);
    throw error; // пробросить дальше если нужно
  }
}

// Способ 3: Отловить необработанные Promise
window.addEventListener('unhandledrejection', (event) => {
  console.error('Необработанная Promise ошибка:', event.reason);
  event.preventDefault(); // предотвратить краш браузера
});

Использование сервиса Error Tracking

Лучше всего использовать специализированные сервисы для отслеживания ошибок:

Sentry (самый популярный):

import * as Sentry from "@sentry/react";

Sentry.init({
  dsn: "https://key@sentry.io/project-id",
  environment: process.env.NODE_ENV,
  tracesSampleRate: 1.0,
});

// Автоматически ловит все ошибки и отправляет на Sentry
// Можно также вручную отправить
Sentry.captureException(error);
Sentry.captureMessage('Важная информация');

// Контекст ошибки
Sentry.setUser({ id: '123', username: 'user@example.com' });
Sentry.setContext('character', { name: 'Mighty Fighter' });

Rollbar:

_rollbarConfig = {
  accessToken: "your-token",
  captureUncaught: true,
  captureUnhandledRejections: true,
};

Rollbar.init(_rollbarConfig);
Rollbar.error('Произошла ошибка', error);

Проверка совместимости браузера

// Проверить поддержку функций
function checkBrowserSupport() {
  const features = {
    fetch: typeof fetch !== 'undefined',
    localStorage: typeof localStorage !== 'undefined',
    serviceWorker: 'serviceWorker' in navigator,
    webWorker: typeof Worker !== 'undefined',
    intersectionObserver: 'IntersectionObserver' in window,
    promise: typeof Promise !== 'undefined',
  };

  console.log('Поддерживаемые возможности:', features);

  if (!features.fetch) {
    console.warn('Браузер не поддерживает Fetch API');
    // Использовать XMLHttpRequest вместо fetch
  }

  return features;
}

checkBrowserSupport();

Логирование производительности

// Измерить время выполнения операции
console.time('loadData');
await loadUserData();
console.timeEnd('loadData');
// Результат: loadData: 234ms

// Performance API
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log('Метрика:', entry.name, entry.duration);
  }
});

observer.observe({ entryTypes: ['measure', 'navigation'] });

// Создать собственную метрику
performance.mark('start-operation');
// ... выполнить операцию ...
performance.mark('end-operation');
performance.measure('operation', 'start-operation', 'end-operation');

Network вкладка (DevTools)

Для отслеживания сетевых ошибок:

// Перехватить все сетевые запросы
window.addEventListener('beforeunload', () => {
  // Логи в Network вкладке DevTools
});

// Или использовать Fetch Interceptor
const originalFetch = window.fetch;
window.fetch = function(...args) {
  console.log('Запрос:', args[0]);

  return originalFetch.apply(this, args)
    .then(response => {
      if (!response.ok) {
        console.error(`Ошибка ${response.status}:`, response.statusText);
      }
      return response;
    })
    .catch(error => {
      console.error('Сетевая ошибка:', error);
      throw error;
    });
};

React Error Boundary

Для ловли ошибок в React компонентах:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false, error: null };
  }

  static getDerivedStateFromError(error) {
    return { hasError: true, error };
  }

  componentDidCatch(error, errorInfo) {
    console.error('Ошибка в компоненте:', error);
    console.error('Инфо:', errorInfo.componentStack);

    // Отправить ошибку на сервер
    logErrorToServer(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      return <div>Что-то пошло не так: {this.state.error.message}</div>;
    }

    return this.props.children;
  }
}

// Использование
<ErrorBoundary>
  <YourComponent />
</ErrorBoundary>

Чеклист отслеживания ошибок

  • Включить DevTools Console для разработки
  • Использовать Error Tracking сервис (Sentry)
  • Перехватить необработанные ошибки на window.error
  • Перехватить необработанные Promise ошибки
  • Логировать сетевые ошибки в Network вкладке
  • Проверить совместимость в разных браузерах
  • Использовать React Error Boundary для React приложений
  • Добавить пользовательское логирование для критических операций