Атрибут onerror тега <body>
Описание
Атрибут onerror позволяет задать JavaScript-обработчик, который выполняется при возникновении ошибки во время загрузки или выполнения скриптов на странице. Это глобальный обработчик ошибок для всего документа.
<body onerror="handlePageError(message, url, line, column, error)">
<h1>Мое приложение</h1>
<script>
function handlePageError(msg, url, line, col, error) {
console.error(`Ошибка: ${msg} в ${url}:${line}:${col}`);
// Отправка информации об ошибке на сервер
return true; // Предотвращает вывод стандартного сообщения об ошибке
}
// Тестовая ошибка
undefinedFunction();
</script>
</body>
Параметры обработчика:
| Параметр | Описание |
|---|---|
message |
Текст сообщения об ошибке |
url |
URL скрипта, в котором произошла ошибка |
line |
Номер строки с ошибкой |
column |
Номер колонки с ошибкой |
error |
Объект Error (не во всех браузерах) |
Рекомендации по использованию:
- Используйте для глобального отлова ошибок на странице
- Сочетайте с
try/catchдля важных участков кода - Реализуйте отправку ошибок на сервер для анализа
- Не злоупотребляйте - некоторые ошибки могут быть полезны в development
- Для современных приложений используйте
window.onerror
Практический пример с обработкой ошибок:
<body>
<div id="error-container" style="display:none;"></div>
<script>
window.onerror = function(msg, url, line, col, error) {
const errorContainer = document.getElementById('error-container');
errorContainer.innerHTML = `
<div class="alert alert-danger">
<h4>Произошла ошибка</h4>
<p>${msg}</p>
<small>${url}, строка ${line}:${col}</small>
</div>
`;
errorContainer.style.display = 'block';
// Отправка на сервер
if (navigator.onLine) {
fetch('/log-error', {
method: 'POST',
body: JSON.stringify({msg, url, line, col, stack: error?.stack})
});
}
return true; // Подавляем стандартное сообщение об ошибке
};
</script>
</body>
Важные замечания:
- Не обрабатывает ошибки в промисах (используйте
unhandledrejection) - Может не срабатывать для некоторых кросс-доменных скриптов
- Разные браузеры передают разный набор параметров
- Возврат
trueпредотвращает вывод стандартного сообщения - Не заменяет полноценную систему логирования ошибок
Современные альтернативы:
<script>
// 1. Обработчик ошибок для промисов
window.addEventListener('unhandledrejection', event => {
console.error('Unhandled rejection:', event.reason);
});
// 2. Использование специализированных сервисов
function initErrorTracking() {
if (typeof Sentry !== 'undefined') {
Sentry.init({dsn: 'YOUR_DSN'});
}
}
// 3. Глобальный try-catch для асинхронного кода
async function runApp() {
try {
// Весь код приложения
} catch (error) {
console.error('Global catch:', error);
}
}
</script>
Примечание: Для production-приложений рекомендуется использовать специализированные системы мониторинга ошибок (Sentry, Rollbar и др.), которые предоставляют более полную информацию о возникающих ошибках и контексте их появления.