Конструктор Error
создаёт объект ошибки. Экземпляры объекта Error
выбрасываются при возникновении ошибок во время выполнения. Объект Error
также может использоваться в качестве базового для пользовательских исключений. Смотрите ниже стандартные встроенные типы ошибок.
Синтаксис
new Error([message[, fileName[, lineNumber]]])
Параметры
message
Необязательный-
Человеко-читаемое описание ошибки.
fileName
Non-standard
Необязательный
-
Значение свойства
fileName
созданного объектаError
. Значением по умолчанию является имя файла, содержащего код, вызвавший конструкторError()
. lineNumber
Non-standard
Необязательный
-
Значение свойства
lineNumber
созданного объектаError
. Значением по умолчанию является номер строки, содержащей вызов конструктораError()
.
Описание
Во время выполнения кода ошибки приводят к созданию и выбрасыванию новых объектов Error
.
Данная страница документирует использование объекта Error
как самого по себе, так и при использовании в качестве функции-конструктора. Список свойств и методов, унаследованных экземплярами объекта Error
, смотрите в разделе Error.prototype
(en-US).
Использование как функции
Когда Error
используется как функции— без new
, она возвращает Error
объект. Следовательно простой вызов Error
произведёт тот же результат, что и конструктор Error
объявленный через new
.
// this:
const x = Error('I was created using a function call!');
// Такая же функциональность:
const y = new Error('I was constructed via the "new" keyword!');
Типы ошибок
Кроме общего конструктора Error
, в JavaScript существует ещё семь других основных конструкторов ошибок. По обработке исключений смотрите раздел Выражения обработки исключений.
EvalError
-
Создаёт экземпляр, представляющий ошибку, возникающую в глобальной функции
eval()
. InternalError
Non-standard
-
Создаёт экземпляр, представляющий ошибку, возникающую при выбрасывании внутренней ошибки в движке JavaScript. К примеру, ошибки «слишком глубокая рекурсия» («too much recursion»).
RangeError
-
Создаёт экземпляр, представляющий ошибку, возникающую при выходе числовой переменной или параметра за пределы допустимого диапазона.
ReferenceError
-
Создаёт экземпляр, представляющий ошибку, возникающую при разыменовывании недопустимой ссылки.
SyntaxError
-
Создаёт экземпляр, представляющий синтаксическую ошибку, возникающую при разборе исходного кода в функции
eval()
. TypeError
-
Создаёт экземпляр, представляющий ошибку, возникающую при недопустимом типе для переменной или параметра.
URIError
-
Создаёт экземпляр, представляющий ошибку, возникающую при передаче в функции
encodeURI()
илиdecodeURI()
недопустимых параметров.
Свойства
Error.prototype
(en-US)-
Позволяет добавлять свойства в экземпляры объекта
Error
.
Методы
Глобальный объект Error
не содержит собственных методов, однако, он наследует некоторые методы из цепочки прототипов.
Экземпляры объекта Error
{{page(‘/ru/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype’, ‘Description’)}}
Свойства
{{page(‘/ru/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype’, ‘Properties’)}}
Методы
{{page(‘/ru/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype’, ‘Methods’)}}
Примеры
Пример: выбрасывание обычной ошибки
Обычно, вы создаёте объект Error
с намерением возбудить ошибку с помощью ключевого слова throw
. Вы можете обработать ошибку с помощью конструкции try...catch
:
try {
throw new Error('Уупс!');
} catch (e) {
console.log(e.name + ': ' + e.message);
}
Пример: обработка ошибки конкретного типа
Возможно, это следует удалить вы можете обрабатывать только какой-то определённый вид ошибок, проверяя тип ошибки в свойстве constructor
или, если вы пишете для современных движков JavaScript, с помощью ключевого слова instanceof
:
try {
foo.bar();
} catch (e) {
if (e instanceof EvalError) {
console.log(e.name + ': ' + e.message);
} else if (e instanceof RangeError) {
console.log(e.name + ': ' + e.message);
}
// ... и т.д.
}
Пример: пользовательские типы ошибок
Вы можете захотеть определить свои собственные типы ошибок, унаследованные от Error
, что бы иметь возможность писать throw new MyError()
и использовать instanceof MyError
для проверки вида ошибки в обработчике исключений. Ниже продемонстрирован общий подход к выполнению этой задачи.
Предупреждение: обратите внимание, что выбрасывание MyError
будет сообщать неправильные номер строки lineNumber
и имя файла fileName
как минимум, в Firefox.
Также смотрите обсуждение «Какой способ расширения Error в JavaScript более предпочтителен?» на Stackoverflow.
// Создаём новый объект, затем через прототип делаем его наследником конструктора Error.
function MyError(message) {
this.name = 'MyError';
this.message = message || 'Сообщение по умолчанию';
this.stack = (new Error()).stack;
}
MyError.prototype = Object.create(Error.prototype);
MyError.prototype.constructor = MyError;
try {
throw new MyError();
} catch (e) {
console.log(e.name); // 'MyError'
console.log(e.message); // 'Сообщение по умолчанию'
}
try {
throw new MyError('пользовательское сообщение');
} catch (e) {
console.log(e.name); // 'MyError'
console.log(e.message); // 'пользовательское сообщение'
}
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-error-objects |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Ошибки — это хорошо. Автор материала, перевод которого мы сегодня публикуем, говорит, что уверен в том, что эта идея известна всем. На первый взгляд ошибки кажутся чем-то страшным. Им могут сопутствовать какие-то потери. Ошибка, сделанная на публике, вредит авторитету того, кто её совершил. Но, совершая ошибки, мы на них учимся, а значит, попадая в следующий раз в ситуацию, в которой раньше вели себя неправильно, делаем всё как нужно.
Выше мы говорили об ошибках, которые люди совершают в обычной жизни. Ошибки в программировании — это нечто иное. Сообщения об ошибках помогают нам улучшать код, они позволяют сообщать пользователям наших проектов о том, что что-то пошло не так, и, возможно, рассказывают пользователям о том, как нужно вести себя для того, чтобы ошибок больше не возникало.
Этот материал, посвящённый обработке ошибок в JavaScript, разбит на три части. Сначала мы сделаем общий обзор системы обработки ошибок в JavaScript и поговорим об объектах ошибок. После этого мы поищем ответ на вопрос о том, что делать с ошибками, возникающими в серверном коде (в частности, при использовании связки Node.js + Express.js). Далее — обсудим обработку ошибок в React.js. Фреймворки, которые будут здесь рассматриваться, выбраны по причине их огромной популярности. Однако рассматриваемые здесь принципы работы с ошибками универсальны, поэтому вы, даже если не пользуетесь Express и React, без труда сможете применить то, что узнали, к тем инструментам, с которыми работаете.
Код демонстрационного проекта, используемого в данном материале, можно найти в этом репозитории.
1. Ошибки в JavaScript и универсальные способы работы с ними
Если в вашем коде что-то пошло не так, вы можете воспользоваться следующей конструкцией.
throw new Error('something went wrong')
В ходе выполнения этой команды будет создан экземпляр объекта Error и будет сгенерировано (или, как говорят, «выброшено») исключение с этим объектом. Инструкция throw может генерировать исключения, содержащие произвольные выражения. При этом выполнение скрипта остановится в том случае, если не были предприняты меры по обработке ошибки.
Начинающие JS-программисты обычно не используют инструкцию throw
. Они, как правило, сталкиваются с исключениями, выдаваемыми либо средой выполнения языка, либо сторонними библиотеками. Когда это происходит — в консоль попадает нечто вроде ReferenceError: fs is not defined
и выполнение программы останавливается.
▍Объект Error
У экземпляров объекта Error
есть несколько свойств, которыми мы можем пользоваться. Первое интересующее нас свойство — message
. Именно сюда попадает та строка, которую можно передать конструктору ошибки в качестве аргумента. Например, ниже показано создание экземпляра объекта Error
и вывод в консоль переданной конструктором строки через обращение к его свойству message
.
const myError = new Error('please improve your code')
console.log(myError.message) // please improve your code
Второе свойство объекта, очень важное, представляет собой трассировку стека ошибки. Это — свойство stack
. Обратившись к нему можно просмотреть стек вызовов (историю ошибки), который показывает последовательность операций, приведшую к неправильной работе программы. В частности, это позволяет понять — в каком именно файле содержится сбойный код, и увидеть, какая последовательность вызовов функций привела к ошибке. Вот пример того, что можно увидеть, обратившись к свойству stack
.
Error: please improve your code
at Object.<anonymous> (/Users/gisderdube/Documents/_projects/hacking.nosync/error-handling/src/general.js:1:79)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at startup (internal/bootstrap/node.js:266:19)
at bootstrapNodeJSCore (internal/bootstrap/node.js:596:3)
Здесь, в верхней части, находится сообщение об ошибке, затем следует указание на тот участок кода, выполнение которого вызвало ошибку, потом описывается то место, откуда был вызван этот сбойный участок. Это продолжается до самого «дальнего» по отношению к ошибке фрагмента кода.
▍Генерирование и обработка ошибок
Создание экземпляра объекта Error
, то есть, выполнение команды вида new Error()
, ни к каким особым последствиям не приводит. Интересные вещи начинают происходить после применения оператора throw
, который генерирует ошибку. Как уже было сказано, если такую ошибку не обработать, выполнение скрипта остановится. При этом нет никакой разницы — был ли оператор throw
использован самим программистом, произошла ли ошибка в некоей библиотеке или в среде выполнения языка (в браузере или в Node.js). Поговорим о различных сценариях обработки ошибок.
▍Конструкция try…catch
Блок try...catch
представляет собой самый простой способ обработки ошибок, о котором часто забывают. В наши дни, правда, он используется гораздо интенсивнее чем раньше, благодаря тому, что его можно применять для обработки ошибок в конструкциях async/await
.
Этот блок можно использовать для обработки любых ошибок, происходящих в синхронном коде. Рассмотрим пример.
const a = 5
try {
console.log(b) // переменная b не объявлена - возникает ошибка
} catch (err) {
console.error(err) // в консоль попадает сообщение об ошибке и стек ошибки
}
console.log(a) // выполнение скрипта не останавливается, данная команда выполняется
Если бы в этом примере мы не заключили бы сбойную команду console.log(b)
в блок try...catch
, то выполнение скрипта было бы остановлено.
▍Блок finally
Иногда случается так, что некий код нужно выполнить независимо от того, произошла ошибка или нет. Для этого можно, в конструкции try...catch
, использовать третий, необязательный, блок — finally
. Часто его использование эквивалентно некоему коду, который идёт сразу после try...catch
, но в некоторых ситуациях он может пригодиться. Вот пример его использования.
const a = 5
try {
console.log(b) // переменная b не объявлена - возникает ошибка
} catch (err) {
console.error(err) // в консоль попадает сообщение об ошибке и стек ошибки
} finally {
console.log(a) // этот код будет выполнен в любом случае
}
▍Асинхронные механизмы — коллбэки
Программируя на JavaScript всегда стоит обращать внимание на участки кода, выполняющиеся асинхронно. Если у вас имеется асинхронная функция и в ней возникает ошибка, скрипт продолжит выполняться. Когда асинхронные механизмы в JS реализуются с использованием коллбэков (кстати, делать так не рекомендуется), соответствующий коллбэк (функция обратного вызова) обычно получает два параметра. Это нечто вроде параметра err
, который может содержать ошибку, и result
— с результатами выполнения асинхронной операции. Выглядит это примерно так:
myAsyncFunc(someInput, (err, result) => {
if(err) return console.error(err) // порядок работы с объектом ошибки мы рассмотрим позже
console.log(result)
})
Если в коллбэк попадает ошибка, она видна там в виде параметра err
. В противном случае в этот параметр попадёт значение undefined
или null
. Если оказалось, что в err
что-то есть, важно отреагировать на это, либо так как в нашем примере, воспользовавшись командой return
, либо воспользовавшись конструкцией if...else
и поместив в блок else
команды для работы с результатом выполнения асинхронной операции. Речь идёт о том, чтобы, в том случае, если произошла ошибка, исключить возможность работы с результатом, параметром result
, который в таком случае может иметь значение undefined
. Работа с таким значением, если предполагается, например, что оно содержит объект, сама может вызвать ошибку. Скажем, это произойдёт при попытке использовать конструкцию result.data
или подобную ей.
▍Асинхронные механизмы — промисы
Для выполнения асинхронных операций в JavaScript лучше использовать не коллбэки а промисы. Тут, в дополнение к улучшенной читабельности кода, имеются и более совершенные механизмы обработки ошибок. А именно, возиться с объектом ошибки, который может попасть в функцию обратного вызова, при использовании промисов не нужно. Здесь для этой цели предусмотрен специальный блок catch
. Он перехватывает все ошибки, произошедшие в промисах, которые находятся до него, или все ошибки, которые произошли в коде после предыдущего блока catch
. Обратите внимание на то, что если в промисе произошла ошибка, для обработки которой нет блока catch
, это не остановит выполнение скрипта, но сообщение об ошибке будет не особенно удобочитаемым.
(node:7741) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: something went wrong
(node:7741) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. */
В результате можно порекомендовать всегда, при работе с промисами, использовать блок catch
. Взглянем на пример.
Promise.resolve(1)
.then(res => {
console.log(res) // 1
throw new Error('something went wrong')
return Promise.resolve(2)
})
.then(res => {
console.log(res) // этот блок выполнен не будет
})
.catch(err => {
console.error(err) // о том, что делать с этой ошибкой, поговорим позже
return Promise.resolve(3)
})
.then(res => {
console.log(res) // 3
})
.catch(err => {
// этот блок тут на тот случай, если в предыдущем блоке возникнет какая-нибудь ошибка
console.error(err)
})
▍Асинхронные механизмы и try…catch
После того, как в JavaScript появилась конструкция async/await
, мы вернулись к классическому способу обработки ошибок — к try...catch...finally
. Обрабатывать ошибки при таком подходе оказывается очень легко и удобно. Рассмотрим пример.
;(async function() {
try {
await someFuncThatThrowsAnError()
} catch (err) {
console.error(err) // об этом поговорим позже
}
console.log('Easy!') // будет выполнено
})()
При таком подходе ошибки в асинхронном коде обрабатываются так же, как в синхронном. В результате теперь, при необходимости, в одном блоке catch
можно обрабатывать более широкий диапазон ошибок.
2. Генерирование и обработка ошибок в серверном коде
Теперь, когда у нас есть инструменты для работы с ошибками, посмотрим на то, что мы можем с ними делать в реальных ситуациях. Генерирование и правильная обработка ошибок — это важнейший аспект серверного программирования. Существуют разные подходы к работе с ошибками. Здесь будет продемонстрирован подход с использованием собственного конструктора для экземпляров объекта Error
и кодов ошибок, которые удобно передавать во фронтенд или любым механизмам, использующим серверные API. Как структурирован бэкенд конкретного проекта — особого значения не имеет, так как при любом подходе можно использовать одни и те же идеи, касающиеся работы с ошибками.
В качестве серверного фреймворка, отвечающего за маршрутизацию, мы будем использовать Express.js. Подумаем о том, какая структура нам нужна для организации эффективной системы обработки ошибок. Итак, вот что нам нужно:
- Универсальная обработка ошибок — некий базовый механизм, подходящий для обработки любых ошибок, в ходе работы которого просто выдаётся сообщение наподобие
Something went wrong, please try again or contact us
, предлагающее пользователю попробовать выполнить операцию, давшую сбой, ещё раз или связаться с владельцем сервера. Эта система не отличается особой интеллектуальностью, но она, по крайней мере, способна сообщить пользователю о том, что что-то пошло не так. Подобное сообщение гораздо лучше, чем «бесконечная загрузка» или нечто подобное. - Обработка конкретных ошибок — механизм, позволяющий сообщить пользователю подробные сведения о причинах неправильного поведения системы и дать ему конкретные советы по борьбе с неполадкой. Например, это может касаться отсутствия неких важных данных в запросе, который пользователь отправляет на сервер, или в том, что в базе данных уже существует некая запись, которую он пытается добавить ещё раз, и так далее.
▍Разработка собственного конструктора объектов ошибок
Здесь мы воспользуемся стандартным классом Error
и расширим его. Пользоваться механизмами наследования в JavaScript — дело рискованное, но в данном случае эти механизмы оказываются весьма полезными. Зачем нам наследование? Дело в том, что нам, для того, чтобы код удобно было бы отлаживать, нужны сведения о трассировке стека ошибки. Расширяя стандартный класс Error
, мы, без дополнительных усилий, получаем возможности по трассировке стека. Мы добавляем в наш собственный объект ошибки два свойства. Первое — это свойство code
, доступ к которому можно будет получить с помощью конструкции вида err.code
. Второе — свойство status
. В него будет записываться код состояния HTTP, который планируется передавать клиентской части приложения.
Вот как выглядит класс CustomError
, код которого оформлен в виде модуля.
class CustomError extends Error {
constructor(code = 'GENERIC', status = 500, ...params) {
super(...params)
if (Error.captureStackTrace) {
Error.captureStackTrace(this, CustomError)
}
this.code = code
this.status = status
}
}
module.exports = CustomError
▍Маршрутизация
Теперь, когда наш объект ошибки готов к использованию, нужно настроить структуру маршрутов. Как было сказано выше, нам требуется реализовать унифицированный подход к обработке ошибок, позволяющий одинаково обрабатывать ошибки для всех маршрутов. По умолчанию фреймворк Express.js не вполне поддерживает такую схему работы. Дело в том, что все его маршруты инкапсулированы.
Для того чтобы справиться с этой проблемой, мы можем реализовать собственный обработчик маршрутов и определять логику маршрутов в виде обычных функций. Благодаря такому подходу, если функция маршрута (или любая другая функция) выбрасывает ошибку, она попадёт в обработчик маршрутов, который затем может передать её клиентской части приложения. При возникновении ошибки на сервере мы планируем передавать её во фронтенд в следующем формате, полагая, что для этого будет применяться JSON-API:
{
error: 'SOME_ERROR_CODE',
description: 'Something bad happened. Please try again or contact support.'
}
Если на данном этапе происходящие кажется вам непонятным — не беспокойтесь — просто продолжайте читать, пробуйте работать с тем, о чём идёт речь, и постепенно вы во всём разберётесь. На самом деле, если говорить о компьютерном обучении, здесь применяется подход «сверху-вниз», когда сначала обсуждаются общие идеи, а потом осуществляется переход к частностям.
Вот как выглядит код обработчика маршрутов.
const express = require('express')
const router = express.Router()
const CustomError = require('../CustomError')
router.use(async (req, res) => {
try {
const route = require(`.${req.path}`)[req.method]
try {
const result = route(req) // Передаём запрос функции route
res.send(result) // Передаём клиенту то, что получено от функции route
} catch (err) {
/*
Сюда мы попадаем в том случае, если в функции route произойдёт ошибка
*/
if (err instanceof CustomError) {
/*
Если ошибка уже обработана - трансформируем её в
возвращаемый объект
*/
return res.status(err.status).send({
error: err.code,
description: err.message,
})
} else {
console.error(err) // Для отладочных целей
// Общая ошибка - вернём универсальный объект ошибки
return res.status(500).send({
error: 'GENERIC',
description: 'Something went wrong. Please try again or contact support.',
})
}
}
} catch (err) {
/*
Сюда мы попадём, если запрос окажется неудачным, то есть,
либо не будет найдено файла, соответствующего пути, переданному
в запросе, либо не будет экспортированной функции с заданным
методом запроса
*/
res.status(404).send({
error: 'NOT_FOUND',
description: 'The resource you tried to access does not exist.',
})
}
})
module.exports = router
Полагаем, комментарии в коде достаточно хорошо его поясняют. Надеемся, читать их удобнее, чем объяснения подобного кода, данные после него.
Теперь взглянем на файл маршрутов.
const CustomError = require('../CustomError')
const GET = req => {
// пример успешного выполнения запроса
return { name: 'Rio de Janeiro' }
}
const POST = req => {
// пример ошибки общего характера
throw new Error('Some unexpected error, may also be thrown by a library or the runtime.')
}
const DELETE = req => {
// пример ошибки, обрабатываемой особым образом
throw new CustomError('CITY_NOT_FOUND', 404, 'The city you are trying to delete could not be found.')
}
const PATCH = req => {
// пример перехвата ошибок и использования CustomError
try {
// тут случилось что-то нехорошее
throw new Error('Some internal error')
} catch (err) {
console.error(err) // принимаем решение о том, что нам тут делать
throw new CustomError(
'CITY_NOT_EDITABLE',
400,
'The city you are trying to edit is not editable.'
)
}
}
module.exports = {
GET,
POST,
DELETE,
PATCH,
}
В этих примерах с самими запросами ничего не делается. Тут просто рассматриваются разные сценарии возникновения ошибок. Итак, например, запрос GET /city
попадёт в функцию const GET = req =>...
, запрос POST /city
попадёт в функцию const POST = req =>...
и так далее. Эта схема работает и при использовании параметров запросов. Например — для запроса вида GET /city?startsWith=R
. В целом, здесь продемонстрировано, что при обработке ошибок, во фронтенд может попасть либо общая ошибка, содержащая лишь предложение попробовать снова или связаться с владельцем сервера, либо ошибка, сформированная с использованием конструктора CustomError
, которая содержит подробные сведения о проблеме.
Данные общей ошибки придут в клиентскую часть приложения в таком виде:
{
error: 'GENERIC',
description: 'Something went wrong. Please try again or contact support.'
}
Конструктор CustomError
используется так:
throw new CustomError('MY_CODE', 400, 'Error description')
Это даёт следующий JSON-код, передаваемый во фронтенд:
{
error: 'MY_CODE',
description: 'Error description'
}
Теперь, когда мы основательно потрудились над серверной частью приложения, в клиентскую часть больше не попадают бесполезные логи ошибок. Вместо этого клиент получает полезные сведения о том, что пошло не так.
Не забудьте о том, что здесь лежит репозиторий с рассматриваемым здесь кодом. Можете его загрузить, поэкспериментировать с ним, и, если надо, адаптировать под нужды вашего проекта.
3. Работа с ошибками на клиенте
Теперь пришла пора описать третью часть нашей системы обработки ошибок, касающуюся фронтенда. Тут нужно будет, во-первых, обрабатывать ошибки, возникающие в клиентской части приложения, а во-вторых, понадобится оповещать пользователя об ошибках, возникающих на сервере. Разберёмся сначала с показом сведений о серверных ошибках. Как уже было сказано, в этом примере будет использована библиотека React.
▍Сохранение сведений об ошибках в состоянии приложения
Как и любые другие данные, ошибки и сообщения об ошибках могут меняться, поэтому их имеет смысл помещать в состояние компонентов. При монтировании компонента данные об ошибке сбрасываются, поэтому, когда пользователь впервые видит страницу, там сообщений об ошибках не будет.
Следующее, с чем надо разобраться, заключается в том, что ошибки одного типа нужно показывать в одном стиле. По аналогии с сервером, здесь можно выделить 3 типа ошибок.
- Глобальные ошибки — в эту категорию попадают сообщения об ошибках общего характера, приходящие с сервера, или ошибки, которые, например, возникают в том случае, если пользователь не вошёл в систему и в других подобных ситуациях.
- Специфические ошибки, выдаваемые серверной частью приложения — сюда относятся ошибки, сведения о которых приходят с сервера. Например, подобная ошибка возникает, если пользователь попытался войти в систему и отправил на сервер имя и пароль, а сервер сообщил ему о том, что пароль неправильный. Подобные вещи в клиентской части приложения не проверяются, поэтому сообщения о таких ошибках должны приходить с сервера.
- Специфические ошибки, выдаваемые клиентской частью приложения. Пример такой ошибки — сообщение о некорректном адресе электронной почты, введённом в соответствующее поле.
Ошибки второго и третьего типов очень похожи, работать с ними можно, используя хранилище состояния компонентов одного уровня. Их главное различие заключается в том, что они исходят из разных источников. Ниже, анализируя код, мы посмотрим на работу с ними.
Здесь будет использоваться встроенная в React система управления состоянием приложения, но, при необходимости, вы можете воспользоваться и специализированными решениями для управления состоянием — такими, как MobX или Redux.
▍Глобальные ошибки
Обычно сообщения о таких ошибках сохраняются в компоненте наиболее высокого уровня, имеющем состояние. Они выводятся в статическом элементе пользовательского интерфейса. Это может быть красное поле в верхней части экрана, модальное окно или что угодно другое. Реализация зависит от конкретного проекта. Вот как выглядит сообщение о такой ошибке.
Сообщение о глобальной ошибке
Теперь взглянем на код, который хранится в файле Application.js
.
import React, { Component } from 'react'
import GlobalError from './GlobalError'
class Application extends Component {
constructor(props) {
super(props)
this.state = {
error: '',
}
this._resetError = this._resetError.bind(this)
this._setError = this._setError.bind(this)
}
render() {
return (
<div className="container">
<GlobalError error={this.state.error} resetError={this._resetError} />
<h1>Handling Errors</h1>
</div>
)
}
_resetError() {
this.setState({ error: '' })
}
_setError(newError) {
this.setState({ error: newError })
}
}
export default Application
Как видно, в состоянии, в Application.js
, имеется место для хранения данных ошибки. Кроме того, тут предусмотрены методы для сброса этих данных и для их изменения.
Ошибка и метод для сброса ошибки передаётся компоненту GlobalError
, который отвечает за вывод сообщения об ошибке на экран и за сброс ошибки после нажатия на значок x
в поле, где выводится сообщение. Вот код компонента GlobalError
(файл GlobalError.js
).
import React, { Component } from 'react'
class GlobalError extends Component {
render() {
if (!this.props.error) return null
return (
<div
style={{
position: 'fixed',
top: 0,
left: '50%',
transform: 'translateX(-50%)',
padding: 10,
backgroundColor: '#ffcccc',
boxShadow: '0 3px 25px -10px rgba(0,0,0,0.5)',
display: 'flex',
alignItems: 'center',
}}
>
{this.props.error}
<i
className="material-icons"
style={{ cursor: 'pointer' }}
onClick={this.props.resetError}
>
close
</font></i>
</div>
)
}
}
export default GlobalError
Обратите внимание на строку if (!this.props.error) return null
. Она указывает на то, что при отсутствии ошибки компонент ничего не выводит. Это предотвращает постоянный показ красного прямоугольника на странице. Конечно, вы, при желании, можете поменять внешний вид и поведение этого компонента. Например, вместо того, чтобы сбрасывать ошибку по нажатию на x
, можно задать тайм-аут в пару секунд, по истечении которого состояние ошибки сбрасывается автоматически.
Теперь, когда всё готово для работы с глобальными ошибками, для задания глобальной ошибки достаточно воспользоваться _setError
из Application.js
. Например, это можно сделать в том случае, если сервер, после обращения к нему, вернул сообщение об общей ошибке (error: 'GENERIC'
). Рассмотрим пример (файл GenericErrorReq.js
).
import React, { Component } from 'react'
import axios from 'axios'
class GenericErrorReq extends Component {
constructor(props) {
super(props)
this._callBackend = this._callBackend.bind(this)
}
render() {
return (
<div>
<button onClick={this._callBackend}>Click me to call the backend</button>
</div>
)
}
_callBackend() {
axios
.post('/api/city')
.then(result => {
// сделать что-нибудь с результатом в том случае, если запрос оказался успешным
})
.catch(err => {
if (err.response.data.error === 'GENERIC') {
this.props.setError(err.response.data.description)
}
})
}
}
export default GenericErrorReq
На самом деле, на этом наш разговор об обработке ошибок можно было бы и закончить. Даже если в проекте нужно оповещать пользователя о специфических ошибках, никто не мешает просто поменять глобальное состояние, хранящее ошибку и вывести соответствующее сообщение поверх страницы. Однако тут мы не остановимся и поговорим о специфических ошибках. Во-первых, это руководство по обработке ошибок иначе было бы неполным, а во-вторых, с точки зрения UX-специалистов, неправильно будет показывать сообщения обо всех ошибках так, будто все они — глобальные.
▍Обработка специфических ошибок, возникающих при выполнении запросов
Вот пример специфического сообщения об ошибке, выводимого в том случае, если пользователь пытается удалить из базы данных город, которого там нет.
Сообщение о специфической ошибке
Тут используется тот же принцип, который мы применяли при работе с глобальными ошибками. Только сведения о таких ошибках хранятся в локальном состоянии соответствующих компонентов. Работа с ними очень похожа на работу с глобальными ошибками. Вот код файла SpecificErrorReq.js
.
import React, { Component } from 'react'
import axios from 'axios'
import InlineError from './InlineError'
class SpecificErrorRequest extends Component {
constructor(props) {
super(props)
this.state = {
error: '',
}
this._callBackend = this._callBackend.bind(this)
}
render() {
return (
<div>
<button onClick={this._callBackend}>Delete your city</button>
<InlineError error={this.state.error} />
</div>
)
}
_callBackend() {
this.setState({
error: '',
})
axios
.delete('/api/city')
.then(result => {
// сделать что-нибудь с результатом в том случае, если запрос оказался успешным
})
.catch(err => {
if (err.response.data.error === 'GENERIC') {
this.props.setError(err.response.data.description)
} else {
this.setState({
error: err.response.data.description,
})
}
})
}
}
export default SpecificErrorRequest
Тут стоит отметить, что для сброса специфических ошибок недостаточно, например, просто нажать на некую кнопку x
. То, что пользователь прочёл сообщение об ошибке и закрыл его, не помогает такую ошибку исправить. Исправить её можно, правильно сформировав запрос к серверу, например — введя в ситуации, показанной на предыдущем рисунке, имя города, который есть в базе. В результате очищать сообщение об ошибке имеет смысл, например, после выполнения нового запроса. Сбросить ошибку можно и в том случае, если пользователь внёс изменения в то, что будет использоваться при формировании нового запроса, то есть — при изменении содержимого поля ввода.
▍Ошибки, возникающие в клиентской части приложения
Как уже было сказано, для хранения данных о таких ошибках можно использовать состояние тех же компонентов, которое используется для хранения данных по специфическим ошибкам, поступающим с сервера. Предположим, мы позволяем пользователю отправить на сервер запрос на удаление города из базы только в том случае, если в соответствующем поле ввода есть какой-то текст. Отсутствие или наличие текста в поле можно проверить средствами клиентской части приложения.
В поле ничего нет, мы сообщаем об этом пользователю
Вот код файла SpecificErrorFrontend.js
, реализующий вышеописанный функционал.
import React, { Component } from 'react'
import axios from 'axios'
import InlineError from './InlineError'
class SpecificErrorRequest extends Component {
constructor(props) {
super(props)
this.state = {
error: '',
city: '',
}
this._callBackend = this._callBackend.bind(this)
this._changeCity = this._changeCity.bind(this)
}
render() {
return (
<div>
<input
type="text"
value={this.state.city}
style={{ marginRight: 15 }}
onChange={this._changeCity}
/>
<button onClick={this._callBackend}>Delete your city</button>
<InlineError error={this.state.error} />
</div>
)
}
_changeCity(e) {
this.setState({
error: '',
city: e.target.value,
})
}
_validate() {
if (!this.state.city.length) throw new Error('Please provide a city name.')
}
_callBackend() {
this.setState({
error: '',
})
try {
this._validate()
} catch (err) {
return this.setState({ error: err.message })
}
axios
.delete('/api/city')
.then(result => {
// сделать что-нибудь с результатом в том случае, если запрос оказался успешным
})
.catch(err => {
if (err.response.data.error === 'GENERIC') {
this.props.setError(err.response.data.description)
} else {
this.setState({
error: err.response.data.description,
})
}
})
}
}
export default SpecificErrorRequest
▍Интернационализация сообщений об ошибках с использованием кодов ошибок
Возможно, сейчас вы задаётесь вопросом о том, зачем нам нужны коды ошибок (наподобие GENERIC
), если мы показываем пользователю только сообщения об ошибках, полученных с сервера. Дело в том, что, по мере роста и развития приложения, оно, вполне возможно, выйдет на мировой рынок, а это означает, что настанет время, когда создателям приложения нужно будет задуматься о поддержке им нескольких языков. Коды ошибок позволяют отличать их друг от друга и выводить сообщения о них на языке пользователя сайта.
Итоги
Надеемся, теперь у вас сформировалось понимание того, как можно работать с ошибками в веб-приложениях. Нечто вроде console.error(err)
следует использовать только в отладочных целях, в продакшн подобные вещи, забытые программистом, проникать не должны. Упрощает решение задачи логирования использование какой-нибудь подходящей библиотеки наподобие loglevel.
Уважаемые читатели! Как вы обрабатываете ошибки в своих проектах?
Error
Объекты ошибок выбрасываются при возникновении ошибок времени выполнения. Объект Error
также можно использовать в качестве базового объекта для пользовательских исключений. См. Ниже стандартные встроенные типы ошибок.
Description
Error types
Помимо общей Error
конструктора, есть и другие конструкторы основной ошибки в JavaScript. Информацию об исключениях на стороне клиента см. В разделе Операторы обработки исключений .
EvalError
-
Создает экземпляр, представляющий ошибку, возникающую в отношении глобальной функции
eval()
. RangeError
-
Создает экземпляр,представляющий ошибку,которая возникает,когда числовая переменная или параметр выходит за пределы допустимого диапазона.
ReferenceError
-
Создает экземпляр,представляющий собой ошибку,которая возникает при удалении недействительной ссылки.
SyntaxError
-
Создает экземпляр,представляющий синтаксическую ошибку.
TypeError
-
Создает экземпляр,представляющий собой ошибку,которая возникает,когда переменная или параметр не имеет допустимого типа.
URIError
-
Создает экземпляр, представляющий ошибку, которая возникает, когда
encodeURI()
илиdecodeURI()
передаются недопустимые параметры. AggregateError
-
Создает экземпляр, представляющий несколько ошибок, заключенных в одну ошибку, когда операция должна сообщить о нескольких ошибках, например с помощью
Promise.any()
. -
InternalError
Non-standard -
Создает экземпляр,представляющий собой ошибку,которая возникает при выбросе внутренней ошибки в движке JavaScript.Например,»слишком большая рекурсия».
Constructor
Error()
-
Создает новый объект
Error
.
Static methods
-
Error.captureStackTrace()
Non-standard -
Нестандартная функция V8, которая создает свойство
stack
в экземпляре Error. -
Error.stackTraceLimit
Non-standard -
Нестандартное числовое свойство V8,которое ограничивает количество кадров стека для включения в трассировку стека ошибок.
-
Error.prepareStackTrace()
Non-standard Optional -
Нестандартная функция V8,которая,если она предусмотрена usercode,вызывается движком V8 JavaScript для брошенных исключений,позволяя пользователю обеспечить пользовательское форматирование стековых трасс.
Instance properties
Error.prototype.message
-
Сообщение об ошибке. Для созданных пользователем объектов
Error
это строка, предоставляемая в качестве первого аргумента конструктора. Error.prototype.name
-
Имя ошибки.Оно определяется функцией конструктора.
Error.prototype.cause
-
Причина ошибки, указывающая причину, по которой возникает текущая ошибка — обычно это другая пойманная ошибка. Для созданных пользователем объектов
Error
это значение, указанное в качестве свойстваcause
второго аргумента конструктора. -
Error.prototype.fileName
Non-standard -
Нестандартное свойство Mozilla для пути к файлу,вызвавшему эту ошибку.
-
Error.prototype.lineNumber
Non-standard -
Нестандартное свойство Mozilla для номера строки в файле,вызвавшем эту ошибку.
-
Error.prototype.columnNumber
Non-standard -
Нестандартное свойство Mozilla для номера столбца в строке,вызвавшей эту ошибку.
-
Error.prototype.stack
Non-standard -
Нестандартное свойство для трассировки стека.
Instance methods
Examples
Бросая общую ошибку
Обычно вы создаете объект Error
с намерением поднять его с помощью ключевого слова throw
. Вы можете обработать ошибку, используя конструкцию try...catch
:
try { throw new Error('Whoops!'); } catch (e) { console.error(`${e.name}: ${e.message}`); }
Обработка ошибок определенного типа
Вы можете выбрать обработку только определенных типов ошибок, проверив тип ошибки с помощью свойства constructor
ошибки или, если вы пишете для современных движков JavaScript, ключевое слово instanceof
:
try { foo.bar(); } catch (e) { if (e instanceof EvalError) { console.error(`${e.name}: ${e.message}`); } else if (e instanceof RangeError) { console.error(`${e.name}: ${e.message}`); } else { throw e; } }
Различайте похожие ошибки
Иногда блок кода может не сработать по причинам,требующим разной обработки,но вызывающим очень похожие ошибки (т.е.с одинаковым типом и сообщением).
Если у вас нет контроля над исходными выдаваемыми ошибками, один из вариантов — их перехватить и выбросить новые объекты Error
с более конкретными сообщениями. Исходная ошибка должна быть передана в новую Error
в option
параметра конструктора ( свойство cause
), так как это гарантирует, что исходная ошибка и трассировка стека будут доступны для блоков try / catch более высокого уровня.
В приведенном ниже примере показано это для двух методов, которые в противном случае потерпели бы неудачу с аналогичными ошибками ( doFailSomeWay()
и doFailAnotherWay()
):
function doWork() { try { doFailSomeWay(); } catch (err) { throw new Error('Failed in some way', { cause: err }); } try { doFailAnotherWay(); } catch (err) { throw new Error('Failed in another way', { cause: err }); } } try { doWork(); } catch (err) { switch(err.message) { case 'Failed in some way': handleFailSomeWay(err.cause); break; case 'Failed in another way': handleFailAnotherWay(err.cause); break; } }
Примечание. Если вы создаете библиотеку, вам лучше использовать причину ошибки, чтобы различать разные выдаваемые ошибки, а не просить ваших потребителей анализировать сообщение об ошибке. См . пример на странице причины ошибки .
Пользовательские типы ошибок также могут использовать свойство cause
при условии, что конструктор подклассов передает параметр options
при вызове super()
:
class MyError extends Error { constructor() { super(message, options); } }
Пользовательские типы ошибок
Возможно, вы захотите определить свои собственные типы ошибок, производные от Error
, чтобы иметь возможность throw new MyError()
и использовать instanceof MyError
для проверки типа ошибки в обработчике исключений. Это приводит к более чистому и последовательному коду обработки ошибок.
См. «Какой хороший способ расширить Error в JavaScript?» на StackOverflow для подробного обсуждения.
Класс ES6 CustomError
Предупреждение. Версии Babel до 7 могут обрабатывать методы класса CustomError
, но только если они объявлены с помощью Object.defineProperty () . В противном случае старые версии Babel и других транспилеров не будут правильно обрабатывать следующий код без дополнительной настройки .
Примечание. Некоторые браузеры включают конструктор CustomError
в трассировку стека при использовании классов ES2015.
class CustomError extends Error { constructor(foo = 'bar', ...params) { super(...params); if (Error.captureStackTrace) { Error.captureStackTrace(this, CustomError); } this.name = 'CustomError'; this.foo = foo; this.date = new Date(); } } try { throw new CustomError('baz', 'bazMessage'); } catch (e) { console.error(e.name); console.error(e.foo); console.error(e.message); console.error(e.stack); }
Объект ES5 CustomError
Предупреждение: все браузеры включают конструктор CustomError
в трассировку стека при использовании объявления прототипа.
function CustomError(foo, message, fileName, lineNumber) { var instance = new Error(message, fileName, lineNumber); instance.foo = foo; Object.setPrototypeOf(instance, CustomError.prototype); if (Error.captureStackTrace) { Error.captureStackTrace(instance, CustomError); } return instance; } Object.setPrototypeOf(CustomError.prototype, Error.prototype); Object.setPrototypeOf(CustomError, Error); CustomError.prototype.name = 'CustomError'; try { throw new CustomError('baz', 'bazMessage'); } catch (e) { console.error(e.name); console.error(e.foo); console.error(e.message); }
Specifications
Browser compatibility
Desktop | Mobile | Server | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | WebView Android | Chrome Android | Firefox для Android | Opera Android | Safari на IOS | Samsung Internet | Deno | Node.js | |
Error |
1 |
12 |
1 |
6 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
Error |
1 |
12 |
1 |
6 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
cause |
93 |
93 |
91 |
No |
No |
15 |
93 |
93 |
91 |
No |
15 |
17.0 |
1.13 |
16.9.0 |
columnNumber |
No |
No |
1 |
No |
No |
No |
No |
No |
4 |
No |
No |
No |
No |
No |
fileName |
No |
No |
1 |
No |
No |
No |
No |
No |
4 |
No |
No |
No |
No |
No |
lineNumber |
No |
No |
1 |
No |
No |
No |
No |
No |
4 |
No |
No |
No |
No |
No |
message |
1 |
12 |
1 |
6 |
5 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
name |
1 |
12 |
1 |
6 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
serializable_object |
77 |
79 |
103 [«Версия 103 сериализует свойства: |
No |
64 |
No |
77 |
77 |
103 [«Версия 103 сериализует свойства: |
55 |
No |
12.0 |
No |
No |
stack |
3 |
12 |
1 |
10 |
10.5 |
6 |
≤37 |
18 |
4 |
11 |
6 |
1.0 |
1.0 |
0.10.0 |
toString |
1 |
12 |
1 |
6 |
4 |
1 |
4.4 |
18 |
4 |
10.1 |
1 |
1.0 |
1.0 |
0.10.0 |
See also
-
Полифил
Error
с современным поведением, таким какcause
поддержки , доступен вcore-js
. throw
try...catch
- Документация V8 для
Error.captureStackTrace()
,Error.stackTraceLimit
иError.prepareStackTrace()
.
JavaScript
-
encodeURI()
Функция encodeURI()кодирует a,заменяя каждый экземпляр определенных символов двумя,тремя или четырьмя управляющими последовательностями,представляющими кодировку UTF-8 (будет
-
encodeURIComponent()
Функция encodeURIComponent()кодирует a,заменяя каждый экземпляр определенных символов двумя,тремя или четырьмя управляющими последовательностями,представляющими кодировку UTF-8
-
Error.prototype.cause
Свойство cause указывает на конкретную причину ошибки.
-
Error.prototype.columnNumber
Нестандартный:Эта функция не соответствует стандартам.
JavaScript поддерживает компактный набор инструкций, особенно управляющих инструкций, которые вы можете использовать, чтобы реализовать интерактивность в вашем приложении. В данной главе дается обзор этих инструкций.
Более подробная информация об инструкциях, рассмотренных в данной главе, содержится в справочнике по JavaScript. Точка с запятой ( ;
) используется для разделения инструкций в коде.
Любое выражение (expression) в JavaScript является также инструкцией (statement). Чтобы получить более подробную информацию о выражениях, прочитайте Выражения и операторы.
Инструкция block
Инструкция block является фундаментальной и используется для группировки других инструкций. Блок ограничивается фигурными скобками:
{ statement_1; statement_2; ... statement_n; }
Блок обычно используется с управляющими инструкциями (например, if
, for
, while
).
while (x < 10) { x++; }
В вышеприведенном примере { x++; }
является блоком.
Обратите внимание на то, что в JavaScript отсутствует область видимости блока до ECMAScript 6. Переменные, объявленные внутри блока, имеют область видимости функции (или скрипта), в которой находится данный блок. Такие переменные доступны за пределами блока. Другими словами, блок не создает новую область видимости. Хотя «автономные» (standalone) блоки являются корректными синтаксическими конструкциями, но вам не следует их использовать, т.к. они не делают то, что вы ожидаете, если вы ожидаете, что они ведут себя как блоки в C или Java. Например:
var x = 1;
{
var x = 2;
}
console.log(x); // 2
В вышеприведенном примере инструкция var x
внутри блока находится в той же области видимости, что и инструкция var x
перед блоком. В C или Java эквивалентный код выведет значение 1.
Начиная с ECMAScript 6, оператор let
позволяет объявить переменную в области видимости блока. Чтобы получить более подробную информацию, прочитайте let
.
Условные инструкции
Условная инструкция — это набор команд, которые выполняются, если указанное условие является истинным. JavaScript поддерживает две условные инструкции: if...else
и switch
.
Инструкция if…else
В следующем примере инструкция statement_1
выполняется, если условие condition
является истинным, в противном случае выполняется инструкция statement_2
. Ветвь else
является необязательной.
if (condition) { statement_1; } else { statement_2; }
Условием может быть любое выражение, которое вычисляется в true или false. Чтобы получить более подробную информацию о значениях true и false, прочитайте Boolean.
Используйте else if
, чтобы последовательно проверить несколько условий:
if (condition_1) { statement_1; } else if (condition_2) { statement_2; } else if (condition_n) { statement_n; } else { statement_else; }
Используйте блок ( { ... }
) для группировки нескольких инструкций. Применение блоков является хорошей практикой, особенно когда используются вложенные инструкции if
:
if (condition) { statement_1_runs_if_condition_is_true; statement_2_runs_if_condition_is_true; } else { statement_3_runs_if_condition_is_false; statement_4_runs_if_condition_is_false; }
Нежелательно использовать простые присваивания в условном выражении, т.к. присваивание может быть спутано с равенством при быстром просмотре кода. Например, не используйте следующий код:
if (x = y) { /* ... */ }
Если вам нужно использовать присваивание в условном выражении, то распространенной практикой является заключение операции присваивания в дополнительные скобки. Например:
if ( (x = y) ) { /* ... */ }
Ложные значения
Следующие значения являются ложными:
false
undefined
null
0
NaN
- пустая строка (
""
)
Все остальные значения, включая все объекты, будут восприняты как истина при передаче в условное выражение.
Не путайте примитивные логические значения true
и false
со значениями true и false объекта Boolean
. Например:
var b = new Boolean(false);
!!
b
; // true
В следующем примере функция checkData
возвращает true
, если число символов в объекте Text
равно трем; в противном случае функция отображает окно alert и возвращает false
.
function checkData() {
if (document.form1.threeChar.value.length == 3) {
return true;
} else {
alert("Enter exactly three characters. " +
document.form1.threeChar.value + " is not valid.");
return false;
}
}
Инструкция switch
Инструкция switch
позволяет сравнить значение выражения с различными вариантами и при совпадении выполнить соответствующий код. Инструкция имеет следующий вид:
switch (expression) { case label_1: statements_1 [break;] case label_2: statements_2 [break;] ... default: statements_default [break;] }
Сначала производится поиск ветви case
с меткой label
, совпадающей со значением выражения expression
. Если совпадение найдено, то соответствующий данной ветви код выполняется до оператора break
, который прекращает выполнение switch
и передает управление дальше. В противном случае управление передается необязательной ветви default
и выполняется соответствующий ей код. Если ветвь default
не найдена, то программа продолжит выполняться со строчки, следующей за инструкцией switch
. По соглашению ветвь default
является последней ветвью, но следовать этому соглашению необязательно.
Если оператор break
отсутствует, то после выполнения кода, который соответствует выбранной ветви, начнется выполнение кода, который следует за ней.
В следующем примере если fruittype
имеет значение "Bananas"
, то будет выведено сообщение "Bananas are $0.48 a pound."
и оператор break
прекратит выполнение switch
. Если бы оператор break
отсутствовал, то был бы также выполнен код, соответствующий ветви "Cherries"
, т.е. выведено сообщение "Cherries are $3.00 a pound."
.
switch (fruittype) {
case "Oranges":
console.log("Oranges are $0.59 a pound.");
break;
case "Apples":
console.log("Apples are $0.32 a pound.");
break;
case "Bananas":
console.log("Bananas are $0.48 a pound.");
break;
case "Cherries":
console.log("Cherries are $3.00 a pound.");
break;
case "Mangoes":
console.log("Mangoes are $0.56 a pound.");
break;
case "Papayas":
console.log("Mangoes and papayas are $2.79 a pound.");
break;
default:
console.log("Sorry, we are out of " + fruittype + ".");
}
console.log("Is there anything else you'd like?");
Инструкции обработки исключений
Инструкция throw
используется, чтобы выбросить исключение, а инструкция try...catch
, чтобы его обработать.
Типы исключений
Практически любой объект может быть выброшен как исключение. Тем не менее, не все выброшенные объекты создаются равными. Обычно числа или строки выбрасываются как исключения, но часто более эффективным является использование одного из типов исключений, специально созданных для этой цели:
- Исключения ECMAScript
DOMException
иDOMError
Инструкция throw
Используйте инструкцию throw
, чтобы выбросить исключение. При выбросе исключения нужно указать выражение, содержащее значение, которое будет выброшено:
throw expression;
Вы можете выбросить любое выражение, а не только выражения определенного типа. В следующем примере выбрасываются исключения различных типов:
throw "Error2"; // string throw 42; // number throw true; // boolean throw { toString: function() { return "I'm an object!"; } };
// object
Примечание: Вы можете выбросить объект как исключение. Вы можете обращаться к свойствам данного объекта в блоке catch
.
В следующем примере объект UserException
выбрасывается как исключение:
function UserException (message) {
this.message = message;
this.name = "UserException";
}
UserException.prototype.toString = function () {
return this.name + ': "' + this.message + '"';
}
throw new UserException("Value too high");
Инструкция try…catch
Инструкция try...catch
состоит из блока try
, который содержит одну или несколько инструкций, и нуля или более блоков catch
, которые содержат инструкции, определяющие порядок действий при выбросе исключения в блоке try
. Иными словами, если в блоке try
будет выброшено исключение, то управление будет передано в блок catch
. Если в блоке try
не возникнет исключений, то блок catch
будет пропущен. Блок finally
будет выполнен после окончания работы блоков try
и catch
, вне зависимости от того, было ли выброшено исключение.
В следующем примере вызывается функция getMonthName
, которая возвращает название месяца по его номеру. Если месяца с указанным номером не существует, то функция выбросит исключение "InvalidMonthNo"
, которое будет перехвачено в блоке catch
:
function getMonthName (mo) {
mo = mo - 1;
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
if (months[mo] != undefined) {
return months[mo];
} else {
throw "InvalidMonthNo";
}
}
try {
monthName = getMonthName(myMonth);
} catch (e) {
monthName = "unknown";
}
Блок catch
Используйте блок catch
, чтобы обработать исключения, сгенерированные в блоке try
.
catch (catchID) { statements }
JavaScript создает идентификатор catchID
, которому присваивается перехваченное исключение, при входе в блок catch
; данный идентификатор доступен только в пределах блока catch
и уничтожается при выходе из него.
В следующем примере выбрасывается исключение, которое перехватывается в блоке catch
:
try { throw "myException" } catch (e) {
console.error(e);
}
Блок finally
Блок finally
содержит код, который будет выполнен после окончания работы блоков try
и catch
, но до того, как будет выполнен код, который следует за инструкцией try...catch
. Блок finally
выполняется вне зависимости от того, было ли выброшено исключение. Блок finally
выполняется даже в том случае, если исключение не перехватывается в блоке catch
.
В следующем примере открывается файл, затем в блоке try
происходит вызов функции writeMyFile
, который может выбросить исключение. Если возникает исключение, то оно обрабатывается в блоке catch
. В любом случае файл будет закрыт функцией closeMyFile
, вызов которой находится в блоке finally
.
openMyFile();
try {
writeMyFile(theData);
} catch(e) {
handleError(e);
} finally {
closeMyFile();
}
Если блок finally
возвращает значение, то данное значение становится возвращаемым значением всей связки try-catch-finally
. Значения, возвращаемые блоками try
и catch
, будут проигнорированы.
function f() {
try {
console.log(0);
throw "bogus";
} catch(e) {
console.log(1);
return true; // приостанавливается до завершения блока `finally`
console.log(2); // не выполняется
} finally {
console.log(3);
return false; // заменяет предыдущий `return`
console.log(4); // не выполняется
}
// `return false` выполняется сейчас
console.log(5); // не выполняется
}
f(); // отображает 0, 1, 3 и возвращает `false`
Замена возвращаемых значений блоком finally
распространяется в том числе и на исключения, которые выбрасываются или перевыбрасываются в блоке catch
:
function f() {
try {
throw "bogus";
} catch(e) {
console.log('caught inner "bogus"');
throw e; // приостанавливается до завершения блока `finally`
} finally {
return false; // заменяет предыдущий `throw`
}
// `return false` выполняется сейчас
}
try {
f();
} catch(e) {
// Не выполняется, т.к. `throw` в `catch `заменяется на `return` в `finally`
console.log('caught outer "bogus"');
}
// В результате отображается сообщение caught inner "bogus"
// и возвращается значение `false`
Вложенные инструкции try...catch
Вы можете вкладывать инструкции try...catch
друг в друга. Если внутренняя инструкция try...catch
не имеет блока catch
, то исключение будет перехвачено во внешнем блоке catch
.
Использование объекта Error
В зависимости от типа ошибки вы можете использовать свойства name
и message
, чтобы получить более подробную информацию. Свойство name
содержит название ошибки (например, DOMException
или Error
), свойство message
— описание ошибки.
Если вы выбрасываете собственные исключения, то чтобы получить преимущество, которое предоставляют эти свойства (например, если ваш блок catch
не делает различий между вашими исключениями и системными), используйте конструктор Error
. Например:
function doSomethingErrorProne () {
if ( ourCodeMakesAMistake() ) {
throw ( new Error('The message') );
} else {
doSomethingToGetAJavascriptError();
}
}
try {
doSomethingErrorProne();
} catch (e) {
console.log(e.name); // 'Error'
console.log(e.message); // 'The message' или JavaScript error message
}
Объект Promise
Начиная с ECMAScript 6, JavaScript поддерживает объект Promise
, который используется для отложенных и асинхронных операций.
Объект Promise
может находиться в следующих состояниях:
- ожидание (pending): начальное состояние, не выполнено и не отклонено.
- выполнено (fulfilled): операция завершена успешно.
- отклонено (rejected): операция завершена с ошибкой.
- заданный (settled): обещание выполнено или отклонено, но не находится в состоянии ожидания.
Загрузка изображения при помощи XHR
Простой пример использования объектов Promise
и XMLHttpRequest
для загрузки изображения доступен в репозитории MDN promise-test на GitHub. Вы также можете посмотреть его в действии. Каждый шаг прокомментирован, что позволяет вам разобраться в архитектуре Promise
и XHR. Здесь приводится версия без комментариев:
function imgLoad(url) {
return new Promise(function(resolve, reject) {
var request = new XMLHttpRequest();
request.open('GET', url);
request.responseType = 'blob';
request.onload = function() {
if (request.status === 200) {
resolve(request.response);
} else {
reject(Error('Image didn't load successfully; error code:'
+ request.statusText));
}
};
request.onerror = function() {
reject(Error('There was a network error.'));
};
request.send();
});
}
JavaScript Errors Handbook
This README contains information that I’ve learned over the years about dealing with JavaScript errors, reporting them to the server, and navigating through a lot of bugs that can make this all really hard. Browsers have improved in this area, but there is still room left to improve to make sure that all applications can sanely and soundly handle any error that happens.
Test cases for content found in this guide can be found at https://mknichel.github.io/javascript-errors/.
Table of Contents
- Introduction
- Anatomy of a JavaScript Error
- Producing a JavaScript Error
- Error Messages
- Stack Trace Format
- Catching JavaScript Errors
- window.onerror
- try/catch
- Protected Entry Points
- Promises
- Web Workers
- Chrome Extensions
Introduction
Catching, reporting, and fixing errors is an important part of any application to ensure the health and stability of the application. Since JavaScript code is also executed on the client and in many different browser environments, staying on top of JS Errors from your application can also be hard. There are no formal web specs for how to report JS errors which cause differences in each browser’s implementation. Additionally, there have been many bugs in browsers’ implementation of JavaScript errors as well that have made this even harder. This page navigates through these aspects of JS Errors so that future developers can handle errors better and browsers will hopefully converge on standardized solutions.
Anatomy of a JavaScript Error
A JavaScript error is composed of two primary pieces: the error message and the stack trace. The error message is a string that describes what went wrong, and the stack trace describes where in the code the error happened. JS Errors can be produced either by the browser itself or thrown by application code.
Producing a JavaScript Error
A JS Error can be thrown by the browser when a piece of code doesn’t execute properly, or it can be thrown directly by code.
For example:
In this example, a variable that is actually a number can’t be invoked as a function. The browser will throw an error like TypeError: a is not a function
with a stack trace that points to that line of code.
A developer might also want to throw an error in a piece of code if a certain precondition is not met. For example
if (!checkPrecondition()) { throw new Error("Doesn't meet precondition!"); }
In this case, the error will be Error: Doesn't meet precondition!
. This error will also contain a stack trace that points to the appropriate line. Errors thrown by the browser and application code can be handled the same.
There are multiple ways that developers can throw an error in JavaScript:
throw new Error('Problem description.')
throw Error('Problem description.')
<— equivalent to the first onethrow 'Problem description.'
<— badthrow null
<— even worse
Throwing a string or null is really not recommended since the browser will not attach a stack trace to that error, losing the context of where that error ocurred in the code. It is best to throw an actual Error object, which will contain the error message as well as a stack trace that points to the right lines of code where the error happened.
Error Messages
Each browser has its own set of messages that it uses for the built in exceptions, such as the example above for trying to call a non-function. Browsers will try to use the same messages, but since there is no spec, this is not guaranteed. For example, both Chrome and Firefox use {0} is not a function
for the above example while IE11 will report Function expected
(notably also without reporting what variable was attempted to be called).
However, browsers tend to diverge often as well. When there are multiple default statements in a switch
statement, Chrome will throw "More than one default clause in switch statement"
while Firefox will report "more than one switch default"
. As new features are added to the web, these error messages have to be updated. These differences can come into play later when you are trying to handle reported errors from obfuscated code.
You can find the templates that browsers use for error messages at:
- Firefox — http://mxr.mozilla.org/mozilla1.9.1/source/js/src/js.msg
- Chrome — https://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/messages.js
- Internet Explorer — https://github.com/Microsoft/ChakraCore/blob/4e4d4f00f11b2ded23d1885e85fc26fcc96555da/lib/Parser/rterrors.h
Browsers will produce different error messages for some exceptions.
Stack Trace Format
The stack trace is a description of where the error happened in the code. It is composed of a series of frames, where each frames describe a particular line in the code. The topmost frame is the location where the error was thrown, while the subsequent frames are the function call stack — or how the code was executed to get to that point where the error was thrown. Since JavaScript is usually concatenated and minified, it is also important to have column numbers so that the exact statement can be located when a given line has a multitude of statements.
A basic stack trace in Chrome looks like:
at throwError (http://mknichel.github.io/javascript-errors/throw-error-basic.html:8:9)
at http://mknichel.github.io/javascript-errors/throw-error-basic.html:12:3
Each stack frame consists of a function name (if applicable and the code was not executed in the global scope), the script that it came from, and the line and column number of the code.
Unfortunately, there is no standard for the stack trace format so this differs by browser.
Microsoft Edge and IE 11’s stack trace looks similar to Chrome’s except it explicitly lists Global code:
at throwError (http://mknichel.github.io/javascript-errors/throw-error-basic.html:8:3)
at Global code (http://mknichel.github.io/javascript-errors/throw-error-basic.html:12:3)
Firefox’s stack trace looks like:
throwError@http://mknichel.github.io/javascript-errors/throw-error-basic.html:8:9
@http://mknichel.github.io/javascript-errors/throw-error-basic.html:12:3
Safari’s format is similar to Firefox’s format but is also slightly different:
throwError@http://mknichel.github.io/javascript-errors/throw-error-basic.html:8:18
global code@http://mknichel.github.io/javascript-errors/throw-error-basic.html:12:13
The same basic information is there, but the format is different.
Also note that in the Safari example, aside from the format being different than Chrome, the column numbers are different than both Chrome and Firefox. The column numbers also can deviate more in different error situations — for example in the code (function namedFunction() { throwError(); })();
, Chrome will report the column for the throwError()
function call while IE11 reports the column number as the start of the string. These differences will come back into play later when the server needs to parse the stack trace for reported errors and deobfuscate obfuscated stack traces.
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/Stack for more information on the stack property of errors. When accessing the Error.stack property, Chrome does include the error message as part of the stack but Safari 10+ does not.
The format of stack traces is different by browser in form and column numbers used.
Diving in more, there are a lot of nuances to stack trace formats that are discussed in the below sections.
Naming anonymous functions
By default, anonymous functions have no name and either appear as empty string or «Anonymous function» in the function names in the stack trace (depending on the browser). To improve debugging, you should add a name to all functions to ensure it appears in the stack frame. The easiest way to do this is to ensure that anonymous functions are specified with a name, even if that name is not used anywhere else. For example:
setTimeout(function nameOfTheAnonymousFunction() { ... }, 0);
This will cause the stack trace to go from:
at http://mknichel.github.io/javascript-errors/javascript-errors.js:125:17
to
at nameOfTheAnonymousFunction (http://mknichel.github.io/javascript-errors/javascript-errors.js:121:31)
In Safari, this would go from:
https://mknichel.github.io/javascript-errors/javascript-errors.js:175:27
to
nameOfTheAnonymousFunction@https://mknichel.github.io/javascript-errors/javascript-errors.js:171:41
This method ensures that nameOfTheAnonymousFunction
appears in the frame for any code from inside that function, making debugging much easier. See http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/#toc-debugging-tips for more information.
Assigning functions to a variable
Browsers will also use the name of the variable or property that a function is assigned to if the function itself does not have a name. For example, in
var fnVariableName = function() { ... };
browsers will use fnVariableName
as the name of the function in stack traces.
at throwError (http://mknichel.github.io/javascript-errors/javascript-errors.js:27:9)
at fnVariableName (http://mknichel.github.io/javascript-errors/javascript-errors.js:169:37)
Even more nuanced than that, if this variable is defined within another function, all browsers will use just the name of the variable as the name of the function in the stack trace except for Firefox, which will use a different form that concatenates the name of the outer function with the name of the inner variable. Example:
function throwErrorFromInnerFunctionAssignedToVariable() { var fnVariableName = function() { throw new Error("foo"); }; fnVariableName(); }
will produce in Firefox:
throwErrorFromInnerFunctionAssignedToVariable/fnVariableName@http://mknichel.github.io/javascript-errors/javascript-errors.js:169:37
In other browsers, this would look like:
at fnVariableName (http://mknichel.github.io/javascript-errors/javascript-errors.js:169:37)
Firefox uses different stack frame text for functions defined within another function.
displayName Property
The display name of a function can also be set by the displayName
property in all major browsers except for IE11. In these browsers, the displayName will appear in the devtools debugger, but in all browsers but Safari, it will not be used in Error stack traces (Safari differs from the rest by also using the displayName in the stack trace associated with an error).
var someFunction = function() {}; someFunction.displayName = " # A longer description of the function.";
There is no official spec for the displayName property, but it is supported by all the major browsers. See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/displayName and http://www.alertdebugging.com/2009/04/29/building-a-better-javascript-profiler-with-webkit/ for more information on displayName.
IE11 doesn’t support the displayName property.
Safari uses the displayName property as the symbol name in Error stack traces.
Programatically capturing stack traces
If an error is reported without a stack trace (see more details when this would happen below), then it’s possible to programatically capture a stack trace.
In Chrome, this is really easy to do by using the Error.captureStackTrace
API. See https://github.com/v8/v8/wiki/Stack%20Trace%20API for more information on the use of this API.
For example:
function ignoreThisFunctionInStackTrace() { var err = new Error(); Error.captureStackTrace(err, ignoreThisFunctionInStackTrace); return err.stack; }
In other browsers, a stack trace can also be collected by creating a new error and accessing the stack property of that object:
var err = new Error(''); return err.stack;
However, IE10 only populates the stack trace when the error is actually thrown:
try { throw new Error(''); } catch (e) { return e.stack; }
If none of these approaches work, then it’s possible to create a rough stack trace without line numbers or columns by iterating over the arguments.callee.caller
object — this won’t work in ES5 Strict Mode though and it’s not a recommended approach.
Async stack traces
It is very common for asynchronous points to be inserted into JavaScript code, such as when code uses setTimeout
or through the use of Promises. These async entry points can cause problems for stack traces, since they cause a new execution context to form and the stack trace starts from scratch again.
Chrome DevTools has support for async stack traces, or in other words making sure the stack trace of an error also shows the frames that happened before the async point was introduced. With the use of setTimeout, this will capture who called the setTimeout function that eventually produced an error. See http://www.html5rocks.com/en/tutorials/developertools/async-call-stack/ for more information.
An async stack trace will look like:
throwError @ throw-error.js:2
setTimeout (async)
throwErrorAsync @ throw-error.js:10
(anonymous function) @ throw-error-basic.html:14
Async stack traces are only supported in Chrome DevTools right now, only for exceptions that are thrown when DevTools are open. Stack traces accessed from Error objects in code will not have the async stack trace as part of it.
It is possible to polyfill async stack traces in some cases, but this could cause a significant performance hit for your application since capturing a stack trace is not cheap.
Only Chrome DevTools natively supports async stack traces.
Naming inline scripts and eval
Stack traces for code that was eval’ed or inlined into a HTML page will use the page’s URL and line/column numbers for the executed code.
For example:
at throwError (http://mknichel.github.io/javascript-errors/throw-error-basic.html:8:9)
at http://mknichel.github.io/javascript-errors/throw-error-basic.html:12:3
If these scripts actually come from a script that was inlined for optimization reasons, then the URL, line, and column numbers will be wrong. To work around this problem, Chrome and Firefox support the //# sourceURL=
annotation (Safari, Edge, and IE do not). The URL specified in this annotation will be used as the URL for all stack traces, and the line and column number will be computed relative to the start of the <script>
tag instead of the HTML document. For the same error as above, using the sourceURL annotation with a value of «inline.js» will produce a stack trace that looks like:
at throwError (http://mknichel.github.io/javascript-errors/inline.js:8:9)
at http://mknichel.github.io/javascript-errors/inline.js:12:3
This is a really handy technique to make sure that stack traces are still correct even when using inline scripts and eval.
http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl describes the sourceURL annotation in more detail.
Safari, Edge, and IE do not support the sourceURL annotation for naming inline scripts and evals. If you use inline scripts in IE or Safari and you obfuscate your code, you will not be able to deobfuscate errors that come from those scripts.
Up until Chrome 42, Chrome did not compute line numbers correctly for inline scripts that use the sourceURL annotation. See https://bugs.chromium.org/p/v8/issues/detail?id=3920 for more information.
Line numbers for stack frames from inline scripts are incorrect when the sourceURL annotation is used since they are relative to the start of the HTML document instead of the start of the inline script tag (making correct deobfuscation not possible). https://code.google.com/p/chromium/issues/detail?id=578269
Eval stack traces
For code that uses eval, there are other differences in the stack trace besides whether or not it uses the sourceURL annotation. In Chrome, a stack trace from a statement used in eval could look like:
Error: Error from eval
at evaledFunction (eval at evalError (http://mknichel.github.io/javascript-errors/javascript-errors.js:137:3), <anonymous>:1:36)
at eval (eval at evalError (http://mknichel.github.io/javascript-errors/javascript-errors.js:137:3), <anonymous>:1:68)
at evalError (http://mknichel.github.io/javascript-errors/javascript-errors.js:137:3)
In MS Edge and IE11, this would look like:
Error from eval
at evaledFunction (eval code:1:30)
at eval code (eval code:1:2)
at evalError (http://mknichel.github.io/javascript-errors/javascript-errors.js:137:3)
In Safari:
Error from eval
evaledFunction
eval code
eval@[native code]
evalError@http://mknichel.github.io/javascript-errors/javascript-errors.js:137:7
and in Firefox:
Error from eval
evaledFunction@http://mknichel.github.io/javascript-errors/javascript-errors.js line 137 > eval:1:36
@http://mknichel.github.io/javascript-errors/javascript-errors.js line 137 > eval:1:11
evalError@http://mknichel.github.io/javascript-errors/javascript-errors.js:137:3
These differences can make it hard to parse eval code the same across all browsers.
Each browser uses a different stack trace format for errors that happened inside eval.
Stack traces with native frames
Your JavaScript code can also be called directly from native code. Array.prototype.forEach
is a good example — you pass a function to forEach
and the JS engine will call that function for you.
function throwErrorWithNativeFrame() { var arr = [0, 1, 2, 3]; arr.forEach(function namedFn(value) { throwError(); }); }
This produces different stack traces in different browsers. Chrome and Safari append the name of the native function in the stack trace itself as a separate frame, such as:
(Chrome)
at namedFn (http://mknichel.github.io/javascript-errors/javascript-errors.js:153:5)
at Array.forEach (native)
at throwErrorWithNativeFrame (http://mknichel.github.io/javascript-errors/javascript-errors.js:152:7)
(Safari)
namedFn@http://mknichel.github.io/javascript-errors/javascript-errors.js:153:15
forEach@[native code]
throwErrorWithNativeFrame@http://mknichel.github.io/javascript-errors/javascript-errors.js:152:14
(Edge)
at namedFn (http://mknichel.github.io/javascript-errors/javascript-errors.js:153:5)
at Array.prototype.forEach (native code)
at throwErrorWithNativeFrame (http://mknichel.github.io/javascript-errors/javascript-errors.js:152:7)
However, Firefox and IE11 do not show that forEach
was called as part of the stack:
namedFn@http://mknichel.github.io/javascript-errors/javascript-errors.js:153:5
throwErrorWithNativeFrame@http://mknichel.github.io/javascript-errors/javascript-errors.js:152:3
Some browsers include native code frames in stack traces, while others do not.
Catching JavaScript Errors
To detect that your application had an error, some code must be able to catch that error and report about it. There are multiple techniques for catching errors, each with their pros and cons.
window.onerror
window.onerror
is one of the easiest and best ways to get started catching errors. By assigning window.onerror
to a function, any error that is uncaught by another part of the application will be reported to this function, along with some information about the error. For example:
window.onerror = function(msg, url, line, col, err) { console.log('Application encountered an error: ' + msg); console.log('Stack trace: ' + err.stack); }
https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers/onerror describes this in more detail.
Historically, there have been a few problems with this approach:
No Error object provided
The 5th argument to the window.onerror
function is supposed to be an Error object. This was added to the WHATWG spec in 2013: https://html.spec.whatwg.org/multipage/webappapis.html#errorevent. Chrome, Firefox, and IE11 now properly provide an Error object (along with the critical stack property), but Safari, MS Edge, and IE10 do not. This works in Firefox since Firefox 14 (https://bugzilla.mozilla.org/show_bug.cgi?id=355430) and in Chrome since late 2013 (https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror, https://code.google.com/p/chromium/issues/detail?id=147127). Safari 10 launched support for the Error object in window.onerror.
Safari (versions below 10), MS Edge, and IE10 do not support an Error object with a stack trace in window.onerror.
Cross domain sanitization
In Chrome, errors that come from another domain in the window.onerror handler will be sanitized to «Script error.», «», 0. This is generally okay if you really don’t want to process the error if it comes from a script that you don’t care about, so the application can filter out errors that look like this. However, this does not happen in Firefox or Safari or IE11, nor does Chrome do this for try/catch blocks that wrap the offending code.
If you would like to receive errors in window.onerror
in Chrome with full fidelity from cross domain scripts, those resources must provide the appropriate cross origin headers. See https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror for more information.
Chrome is the only browser that will sanitize errors that come from another origin. Take care to filter these out, or set the appropriate headers.
Chrome Extensions
In old versions of Chrome, Chrome extensions that are installed on a user’s machine could also throw errors that get reported to window.onerror. This has been fixed in newer versions of Chrome. See the dedicated Chrome Extensions section below.
window.addEventListener(«error»)
The window.addEventListener("error")
API works the same as the window.onerror API. See http://www.w3.org/html/wg/drafts/html/master/webappapis.html#runtime-script-errors for more information on this approach.
Showing errors in DevTools console for development
Catching errors via window.onerror does not prevent that error from also appearing in the DevTools console. This is most likely the right behavior for development since the developer can easily see the error. If you don’t want these errors to show up in production to end users, e.preventDefault()
can be called if using the window.addEventListener approach.
Recommendation
window.onerror is the best tool to catch and report JS errors. It’s recommended that only JS errors with valid Error objects and stack traces are reported back to the server, otherwise the errors may be hard to investigate or you may get a lot of spam from Chrome extensions or cross domain scripts.
try/catch
Given the above section, unfortunately it’s not possible to rely on window.onerror
in all browsers to capture all error information. For catching exceptions locally, a try/catch block is the obvious choice. It’s also possible to wrap entire JavaScript files in a try/catch block to capture error information that can’t be caught with window.onerror. This improves the situations for browsers that don’t support window.onerror, but also has some downsides.
Doesn’t catch all errors
A try/catch block won’t capture all errors in a program, such as errors that are thrown from an async block of code through window.setTimeout
. Try/catch can be used with Protected Entry Points to help fill in the gaps.
try/catch blocks wrapping the entire application aren’t sufficient to catch all errors.
Deoptimizations
Old versions of V8 (and potentially other JS engines), functions that contain a try/catch block won’t be optimized by the compiler (http://www.html5rocks.com/en/tutorials/speed/v8/). Chrome fixed this in TurboFan (https://codereview.chromium.org/1996373002).
Protected Entry Points
An «entry point» into JavaScript is any browser API that can start execution of your code. Examples include setTimeout
, setInterval
, event listeners, XHR, web sockets, or promises. Errors that are thrown from these entry points will be caught by window.onerror, but in the browsers that don’t support the full Error object in window.onerror, an alternative mechanism is needed to catch these errors since the try/catch method mentioned above won’t catch them either.
Thankfully, JavaScript allows these entry points to be wrapped so that a try/catch block can be inserted before the function is invoked to catch any errors thrown by the code.
Each entry point will need slightly different code to protect the entry point, but the gist of the methodology is:
function protectEntryPoint(fn) { return function protectedFn() { try { return fn(); } catch (e) { // Handle error. } } } _oldSetTimeout = window.setTimeout; window.setTimeout = function protectedSetTimeout(fn, time) { return _oldSetTimeout.call(window, protectEntryPoint(fn), time); };
Promises
Sadly, it’s easy for errors that happen in Promises to go unobserved and unreported. Errors that happen in a Promise but are not handled by attaching a rejection handler are not reported anywhere else — they do not get reported to window.onerror
. Even if a Promise attaches a rejection handler, that code itself must manually report those errors for them to be logged. See http://www.html5rocks.com/en/tutorials/es6/promises/#toc-error-handling for more information. For example:
window.onerror = function(...) { // This will never be invoked by Promise code. }; var p = new Promise(...); p.then(function() { throw new Error("This error will be not handled anywhere."); }); var p2 = new Promise(...); p2.then(function() { throw new Error("This error will be handled in the chain."); }).catch(function(error) { // Show error message to user // This code should manually report the error for it to be logged on the server, if applicable. });
One approach to capture more information is to use Protected Entry Points to wrap invocations of Promise methods with a try/catch to report errors. This might look like:
var _oldPromiseThen = Promise.prototype.then; Promise.prototype.then = function protectedThen(callback, errorHandler) { return _oldPromiseThen.call(this, protectEntryPoint(callback), protectEntryPoint(errorHandler)); };
Sadly, errors from Promises will go unhandled by default.
Error handling in Promise polyfills
Promise implementations, such as Q, Bluebird, and Closure handle errors in different ways which are better than the error handling in the browser implementation of Promises.
- In Q, you can «end» the Promise chain by calling
.done()
which will make sure that if an error wasn’t handled in the chain, it will get rethrown and reported. See https://github.com/kriskowal/q#handling-errors - In Bluebird, unhandled rejections are logged and reported immediately. See http://bluebirdjs.com/docs/features.html#surfacing-unhandled-errors
- In Closure’s goog.Promise implementation, unhandled rejections are logged and reported if no chain in the Promise handles the rejection within a configurable time interval (in order to allow code later in the program to add a rejection handler).
Long stack traces
The async stack trace section above discusses that browsers don’t capture stack information when there is an async hook, such as calling Promise.prototype.then
. Promise polyfills feature a way to capture the async stack trace points which can make diagnosing errors much easier. This approach is expensive, but it can be really useful for capturing more debug information.
- In Q, call
Q.longStackSupport = true;
. See https://github.com/kriskowal/q#long-stack-traces - In Bluebird, call
Promise.longStackTraces()
somewhere in the application. See http://bluebirdjs.com/docs/features.html#long-stack-traces. - In Closure, set
goog.Promise.LONG_STACK_TRACES
to true.
Promise Rejection Events
Chrome 49 added support for events that are dispatched when a Promise is rejected. This allows applications to hook into Promise errors to ensure that they get centrally reported along with the rest of the errors.
window.addEventListener('unhandledrejection', event => { // event.reason contains the rejection reason. When an Error is thrown, this is the Error object. });
See https://googlechrome.github.io/samples/promise-rejection-events/ and https://www.chromestatus.com/feature/4805872211460096 for more information.
This is not supported in any other browser.
Web Workers
Web workers, including dedicated workers, shared workers, and service workers, are becoming more popular in applications today. Since all of these workers are separate scripts from the main page, they each need their own error handling code. It is recommended that each worker script install its own error handling and reporting code for maximum effectiveness handling errors from workers.
Dedicated workers
Dedicated web workers execute in a different execution context than the main page, so errors from workers aren’t caught by the above mechanisms. Additional steps need to be taken to capture errors from workers on the page.
When a worker is created, the onerror property can be set on the new worker:
var worker = new Worker('worker.js'); worker.onerror = function(errorEvent) { ... };
This is defined in https://html.spec.whatwg.org/multipage/workers.html#handler-abstractworker-onerror. The onerror
function on the worker has a different signature than the window.onerror
discussed above. Instead of accepting 5 arguments, worker.onerror
takes a single argument: an ErrorEvent
object. The API for this object can be found at https://developer.mozilla.org/en-US/docs/Web/API/ErrorEvent. It contains the message, filename, line, and column, but no stable browser today contains the «Error» object that contains the stack trace (errorEvent.error is null). Since this API is executed in the parent page’s scope, it would be useful for using the same reporting mechanism as the parent page; unfortunately due to the lack of a stack trace, this API is of limited use.
Inside of the JS run by the worker, you can also define an onerror API that follows the usual window.onerror API: https://html.spec.whatwg.org/multipage/webappapis.html#onerroreventhandler. In the worker code:
self.onerror = function(message, filename, line, col, error) { ... };
The discussion of this API mostly follows the discussion above for window.onerror. However, there are 2 notable things to point out:
Firefox and Safari do not report the «error» object as the 5th argument to the function, so these browsers do not get a stack trace from the worker (Chrome, MS Edge, and IE11 do get a stack trace). Protected Entry Points for the
onmessage
function within the worker can be used to capture stack trace information for these browsers.
Since this code executes within the worker, the code must choose how to report the error back to the server: It must either use postMessage
to communicate the error back to the parent page, or install an XHR error reporting mechanism (discussed more below) in the worker itself.
In Firefox, Safari, and IE11 (but not in Chrome), the parent page’s
window.onerror
function will also be called after the worker’s own onerror and the onerror event listener set by the page has been called. However, this window.onerror will also not contain an error object and therefore won’t have a stack trace also. These browsers must also take care to not report errors from workers multiple times.
Shared workers
Chrome and Firefox support the SharedWorker API for sharing a worker among multiple pages. Since the worker is shared, it is not attached to one parent page exclusively; this leads to some differences in how errors are handled, although SharedWorker mostly follows the same information as the dedicated web worker.
In Chrome, when there is an error in a SharedWorker, only the worker’s own error handling within the worker code itself will be called (like if they set self.onerror
). The parent page’s window.onerror
will not be called, and Chrome does not support the inherited AbstractWorker.onerror
that can be called in the parent page as defined in the spec.
In Firefox, this behavior is different. An error in the shared worker will cause the parent page’s window.onerror to be called, but the error object will be null. Additionally, Firefox does support the AbstractWorker.onerror
property, so the parent page can attach an error handler of its own to the worker. However, when this error handler is called, the error object will be null so there will be no stack trace, so it’s of limited use.
Error handling for shared workers differs by browser.
Service Workers
Service Workers are a brand new spec that is currently only available in recent Chrome and Firefox versions. These workers follow the same discussion as dedicated web workers.
Service workers are installed by calling the navigator.serviceWorker.register
function. This function returns a Promise which will be rejected if there was an error installing the service worker, such as it throwing an error during initialization. This error will only contain a string message and nothing else. Additionally, since Promises don’t report errors to window.onerror
handlers, the application itself would have to add a catch block to the Promise to catch the error.
navigator.serviceWorker.register('service-worker-installation-error.js').catch(function(error) { // error typeof string });
Just like the other workers, service workers can set a self.onerror
function within the service workers to catch errors. Installation errors in the service worker will be reported to the onerror function, but unfortunately they won’t contain an error object or stack trace.
The service worker API contains an onerror property inherited from the AbstractWorker interface, but Chrome does not do anything with this property.
Worker Try/Catch
To capture stack traces in Firefox + Safari within a worker, the onmessage
function can be wrapped in a try/catch block to catch any errors that propagate to the top.
self.onmessage = function(event) { try { // logic here } catch (e) { // Report exception. } };
The normal try/catch mechanism will capture stack traces for these errors, producing an exception that looks like:
Error from worker
throwError@http://mknichel.github.io/javascript-errors/worker.js:4:9
throwErrorWrapper@http://mknichel.github.io/javascript-errors/worker.js:8:3
self.onmessage@http://mknichel.github.io/javascript-errors/worker.js:14:7
Chrome Extensions
Chrome Extensions deserve their own section since errors in these scripts can operate slightly differently, and historically (but not anymore) errors from Chrome Extensions have also been a problem for large popular sites.
Content Scripts
Content scripts are scripts that run in the context of web pages that a user visits. These scripts run in an isolated execution environment so they can access the DOM but they can not access JavaScript on the parent page (and vice versa).
Since content scripts have their own execution environment, they can assign to the window.onerror
handler in their own script and it won’t affect the parent page. However, errors caught by window.onerror
in the content script are sanitized by Chrome resulting in a «Script error.» with null filename and 0 for line and column. This bug is tracked by https://code.google.com/p/chromium/issues/detail?id=457785. Until that bug is fixed, a try/catch block or protected entry points are the only ways to catch JS errors in a content script with stack traces.
In years past, errors from content scripts would be reported to the window.onerror
handler of the parent page which could result in a large amount of spammy error reports for popular sites. This was fixed in late 2013 though (https://code.google.com/p/chromium/issues/detail?id=225513).
Errors in Chrome Extensions are sanitized before being handled by window.onerror.
Browser Actions
Chrome extensions can also generate browser action popups, which are small HTML pages that spawn when a user clicks a Chrome extension icon to the right of the URL bar. These pages can also run JavaScript, in an entirely different execution environment from everything else. window.onerror
works properly for this JavaScript.
Reporting Errors to the Server
Once the client is configured to properly catch exceptions with correct stack traces, these exceptions should be reported back to the server so they can be tracked, analyzed, and then fixed. Typically this is done with a XHR endpoint that records the error message and the stack trace information, along with any relevant client context information, such as the version of the code that’s running, the user agent, the user’s locale, and the top level URL of the page.
If the application uses multiple mechanisms to catch errors, it’s important to not report the same error twice. Errors that contain a stack trace should be preferred; errors reported without a stack trace can be hard to track down in a large application.
Ошибки¶
Приложения, работающие в Node.js, обычно сталкиваются с четырьмя категориями ошибок:
- Стандартные ошибки JavaScript, такие как {EvalError}, {SyntaxError}, {RangeError}, {ReferenceError}, {TypeError} и {URIError}.
- Системные ошибки, вызванные ограничениями базовой операционной системы, такими как попытка открыть несуществующий файл или попытка отправить данные через закрытый сокет.
- Пользовательские ошибки, вызванные кодом приложения.
AssertionError
s — это особый класс ошибок, который может быть вызван, когда Node.js обнаруживает исключительное логическое нарушение, которое никогда не должно происходить. Обычно они поднимаютсяassert
модуль.
Все ошибки JavaScript и системные ошибки, вызванные Node.js, наследуются от стандартного класса {Error} JavaScript или являются его экземплярами и гарантированно предоставляют по меньшей мере свойства, доступные в этом классе.
Распространение ошибок и перехват¶
Node.js поддерживает несколько механизмов распространения и обработки ошибок, возникающих во время работы приложения. То, как эти ошибки сообщаются и обрабатываются, полностью зависит от типа Error
и стиль вызываемого API.
Все ошибки JavaScript обрабатываются как исключения, которые немедленно генерировать и выдавать ошибку с помощью стандартного JavaScript throw
механизм. Они обрабатываются с помощью try…catch
строить предоставляется языком JavaScript.
// Throws with a ReferenceError because z is not defined.
try {
const m = 1;
const n = m + z;
} catch (err) {
// Handle the error here.
}
Любое использование JavaScript throw
механизм вызовет исключение, которое должен обрабатываться с использованием try…catch
или процесс Node.js немедленно завершится.
За некоторыми исключениями, Синхронный API (любой метод блокировки, не принимающий callback
функция, например fs.readFileSync
), буду использовать throw
сообщать об ошибках.
Ошибки, возникающие внутри Асинхронные API можно сообщить несколькими способами:
- Большинство асинхронных методов, которые принимают
callback
функция приметError
объект, переданный в качестве первого аргумента этой функции. Если этот первый аргумент неnull
и является экземпляромError
, то произошла ошибка, которую необходимо обработать.
const fs = require('fs');
fs.readFile('a file that does not exist', (err, data) => {
if (err) {
console.error(
'There was an error reading the file!',
err
);
return;
}
// Otherwise handle the data
});
- Когда асинхронный метод вызывается для объекта, который является
EventEmitter
, ошибки могут быть перенаправлены на этот объект'error'
событие.
const net = require('net');
const connection = net.connect('localhost');
// Adding an 'error' event handler to a stream:
connection.on('error', (err) => {
// If the connection is reset by the server, or if it can't
// connect at all, or on any sort of error encountered by
// the connection, the error will be sent here.
console.error(err);
});
connection.pipe(process.stdout);
- Некоторые обычно асинхронные методы в API Node.js могут по-прежнему использовать
throw
механизм для создания исключений, которые должны обрабатываться с помощьюtry…catch
. Исчерпывающего списка таких методов нет; обратитесь к документации по каждому методу, чтобы определить соответствующий требуемый механизм обработки ошибок.
Использование 'error'
механизм событий наиболее распространен для потоковый а также на основе эмиттера событий API-интерфейсы, которые сами по себе представляют собой серию асинхронных операций с течением времени (в отличие от одной операции, которая может пройти или закончиться неудачей).
Для все EventEmitter
объекты, если 'error'
обработчик событий не предоставляется, будет выдана ошибка, в результате чего процесс Node.js сообщит о неперехваченном исключении и завершится сбоем, если только одно из следующих событий: domain
модуль используется надлежащим образом или обработчик зарегистрирован для 'uncaughtException'
событие.
const EventEmitter = require('events');
const ee = new EventEmitter();
setImmediate(() => {
// This will crash the process because no 'error' event
// handler has been added.
ee.emit('error', new Error('This will crash'));
});
Ошибки, сгенерированные таким образом не мочь быть перехваченным с помощью try…catch
как они брошены после код вызова уже вышел.
Разработчики должны обращаться к документации по каждому методу, чтобы точно определить, как распространяются ошибки, вызванные этими методами.
Обратные вызовы при первой ошибке¶
Большинство асинхронных методов, предоставляемых основным API Node.js, следуют идиоматическому шаблону, называемому обратный вызов при первой ошибке. В этом шаблоне функция обратного вызова передается методу в качестве аргумента. Когда операция завершается или возникает ошибка, вызывается функция обратного вызова с Error
объект (если есть) передается в качестве первого аргумента. Если ошибки не возникло, первый аргумент будет передан как null
.
const fs = require('fs');
function errorFirstCallback(err, data) {
if (err) {
console.error('There was an error', err);
return;
}
console.log(data);
}
fs.readFile(
'/some/file/that/does-not-exist',
errorFirstCallback
);
fs.readFile(
'/some/file/that/does-exist',
errorFirstCallback
);
JavaScript try…catch
механизм не мочь использоваться для перехвата ошибок, генерируемых асинхронными API. Распространенная ошибка новичков — пытаться использовать throw
внутри обратного вызова с ошибкой:
// THIS WILL NOT WORK:
const fs = require('fs');
try {
fs.readFile(
'/some/file/that/does-not-exist',
(err, data) => {
// Mistaken assumption: throwing here...
if (err) {
throw err;
}
}
);
} catch (err) {
// This will not catch the throw!
console.error(err);
}
Это не сработает, потому что функция обратного вызова передана в fs.readFile()
вызывается асинхронно. К моменту вызова обратного вызова окружающий код, включая try…catch
блок, уже вышли. Выдача ошибки внутри обратного вызова может привести к сбою процесса Node.js в большинстве случаев. Если домены включены, или обработчик был зарегистрирован с process.on('uncaughtException')
, такие ошибки можно перехватить.
Класс: Error
¶
Общий объект JavaScript {Error}, не указывающий на конкретную причину возникновения ошибки. Error
объекты фиксируют «трассировку стека», детализирующую точку в коде, в которой Error
был создан, и может содержать текстовое описание ошибки.
Все ошибки, генерируемые Node.js, включая все системные ошибки и ошибки JavaScript, будут либо экземплярами, либо унаследованы от Error
класс.
new Error(message)
¶
message
{нить}
Создает новый Error
объект и устанавливает error.message
в предоставленное текстовое сообщение. Если объект передается как message
, текстовое сообщение создается при вызове message.toString()
. В error.stack
свойство будет представлять точку в коде, в которой new Error()
назывался. Трассировки стека зависят от API трассировки стека V8. Трассировки стека распространяются только на (а) начало синхронное выполнение кода, или (b) количество кадров, заданное свойством Error.stackTraceLimit
, в зависимости от того, что меньше.
Error.captureStackTrace(targetObject[, constructorOpt])
¶
targetObject
{Объект}constructorOpt
{Функция}
Создает .stack
собственность на targetObject
, который при доступе возвращает строку, представляющую место в коде, в котором Error.captureStackTrace()
назывался.
const myObject = {};
Error.captureStackTrace(myObject);
myObject.stack; // Similar to `new Error().stack`
Первая строка трассировки будет иметь префикс ${myObject.name}: ${myObject.message}
.
Необязательный constructorOpt
Аргумент принимает функцию. Если указано, все кадры выше constructorOpt
, включая constructorOpt
, будет исключен из сгенерированной трассировки стека.
В constructorOpt
Аргумент полезен для сокрытия деталей реализации генерации ошибок от пользователя. Например:
function MyError() {
Error.captureStackTrace(this, MyError);
}
// Without passing MyError to captureStackTrace, the MyError
// frame would show up in the .stack property. By passing
// the constructor, we omit that frame, and retain all frames below it.
new MyError().stack;
Error.stackTraceLimit
¶
- {количество}
В Error.stackTraceLimit
указывает количество кадров стека, собранных трассировкой стека (независимо от того, сгенерированы ли они new Error().stack
или Error.captureStackTrace(obj)
).
Значение по умолчанию — 10
но может быть установлен на любой допустимый номер JavaScript. Изменения повлияют на любую записанную трассировку стека. после значение было изменено.
Если установлено нечисловое значение или задано отрицательное число, трассировки стека не будут захватывать какие-либо кадры.
error.code
¶
- {нить}
В error.code
Свойство — это строковая метка, определяющая тип ошибки. error.code
это наиболее стабильный способ выявления ошибки. Он будет меняться только между основными версиями Node.js. Наоборот, error.message
строки могут меняться между любыми версиями Node.js. Видеть Коды ошибок Node.js для получения подробной информации о конкретных кодах.
error.message
¶
- {нить}
В error.message
свойство — это строковое описание ошибки, установленное при вызове new Error(message)
. В message
переданный конструктору, также появится в первой строке трассировки стека Error
, однако изменение этого свойства после Error
объект создан может нет изменить первую строку трассировки стека (например, когда error.stack
читается до изменения этого свойства).
const err = new Error('The message');
console.error(err.message);
// Prints: The message
error.stack
¶
- {нить}
В error.stack
свойство — это строка, описывающая точку в коде, в которой Error
был создан.
Error: Things keep happening!
at /home/gbusey/file.js:525:2
at Frobnicator.refrobulate (/home/gbusey/business-logic.js:424:21)
at Actor.<anonymous> (/home/gbusey/actors.js:400:8)
at increaseSynergy (/home/gbusey/actors.js:701:6)
Первая строка отформатирована как <error class name>: <error message>
, за которым следует серия кадров стека (каждая строка начинается с «at»). Каждый фрейм описывает сайт вызова в коде, который приводит к сгенерированной ошибке. V8 пытается отобразить имя для каждой функции (по имени переменной, имени функции или имени метода объекта), но иногда не может найти подходящее имя. Если V8 не может определить имя функции, для этого фрейма будет отображаться только информация о местоположении. В противном случае определенное имя функции будет отображаться с информацией о местоположении, добавленной в круглые скобки.
Фреймы создаются только для функций JavaScript. Если, например, выполнение синхронно проходит через дополнительную функцию C ++, называемую cheetahify
который сам вызывает функцию JavaScript, фрейм, представляющий cheetahify
вызов не будет присутствовать в трассировке стека:
const cheetahify = require('./native-binding.node');
function makeFaster() {
// `cheetahify()` *synchronously* calls speedy.
cheetahify(function speedy() {
throw new Error('oh no!');
});
}
makeFaster();
// will throw:
// /home/gbusey/file.js:6
// throw new Error('oh no!');
// ^
// Error: oh no!
// at speedy (/home/gbusey/file.js:6:11)
// at makeFaster (/home/gbusey/file.js:5:3)
// at Object.<anonymous> (/home/gbusey/file.js:10:1)
// at Module._compile (module.js:456:26)
// at Object.Module._extensions..js (module.js:474:10)
// at Module.load (module.js:356:32)
// at Function.Module._load (module.js:312:12)
// at Function.Module.runMain (module.js:497:10)
// at startup (node.js:119:16)
// at node.js:906:3
Информация о местоположении будет одной из следующих:
native
, если кадр представляет внутренний вызов V8 (как в[].forEach
).plain-filename.js:line:column
, если фрейм представляет собой внутренний вызов Node.js./absolute/path/to/file.js:line:column
, если кадр представляет собой вызов в пользовательской программе или ее зависимостях.
Строка, представляющая трассировку стека, генерируется лениво, когда error.stack
собственность доступ.
Количество кадров, захваченных трассировкой стека, ограничено меньшим из Error.stackTraceLimit
или количество доступных кадров в текущем тике цикла событий.
Класс: AssertionError
¶
- Расширяется: {errors.Error}
Указывает на неудачу утверждения. Подробнее см. Class: assert.AssertionError
.
Класс: RangeError
¶
- Расширяется: {errors.Error}
Указывает, что предоставленный аргумент находится за пределами набора или диапазона допустимых значений для функции; является ли это числовым диапазоном или вне набора опций для данного параметра функции.
require('net').connect(-1);
// Throws "RangeError: "port" option should be >= 0 and < 65536: -1"
Node.js сгенерирует и выбросит RangeError
экземпляры немедленно как форма подтверждения аргумента.
Класс: ReferenceError
¶
- Расширяется: {errors.Error}
Указывает, что предпринимается попытка получить доступ к переменной, которая не определена. Такие ошибки обычно указывают на опечатки в коде или на некорректную программу.
Хотя клиентский код может генерировать и распространять эти ошибки, на практике это будет делать только V8.
doesNotExist;
// Throws ReferenceError, doesNotExist is not a variable in this program.
Если приложение динамически не генерирует и не запускает код, ReferenceError
экземпляры указывают на ошибку в коде или его зависимостях.
Класс: SyntaxError
¶
- Расширяется: {errors.Error}
Указывает, что программа не является допустимым JavaScript. Эти ошибки могут возникать и распространяться только в результате оценки кода. Оценка кода может произойти в результате eval
, Function
, require
, или vm. Эти ошибки почти всегда указывают на неработающую программу.
try {
require('vm').runInThisContext('binary ! isNotOk');
} catch (err) {
// 'err' will be a SyntaxError.
}
SyntaxError
экземпляры невозможно восстановить в контексте, который их создал — они могут быть перехвачены только в других контекстах.
Класс: SystemError
¶
- Расширяется: {errors.Error}
Node.js генерирует системные ошибки, когда в среде выполнения возникают исключения. Обычно это происходит, когда приложение нарушает ограничение операционной системы. Например, системная ошибка произойдет, если приложение попытается прочитать несуществующий файл.
address
{строка} Если присутствует, адрес, к которому не удалось подключиться к сети.code
{строка} Код ошибки строкиdest
{строка} Если присутствует, путь к файлу при сообщении об ошибке файловой системыerrno
{number} Номер ошибки, предоставленный системойinfo
{Object} Если присутствует, дополнительные сведения о состоянии ошибкиmessage
{string} Предоставляемое системой описание ошибки в удобной для чтения форме.path
{строка} Если присутствует, путь к файлу при сообщении об ошибке файловой системыport
{number} Если присутствует, порт сетевого подключения, который недоступенsyscall
{строка} Имя системного вызова, вызвавшего ошибку
error.address
¶
- {нить}
Если представить, error.address
— это строка, описывающая адрес, к которому не удалось установить сетевое соединение.
error.code
¶
- {нить}
В error.code
свойство — это строка, представляющая код ошибки.
error.dest
¶
- {нить}
Если представить, error.dest
— это путь к файлу при сообщении об ошибке файловой системы.
error.errno
¶
- {количество}
В error.errno
свойство — отрицательное число, которое соответствует коду ошибки, определенному в libuv Error handling
.
В Windows номер ошибки, предоставленный системой, будет нормализован libuv.
Чтобы получить строковое представление кода ошибки, используйте util.getSystemErrorName(error.errno)
.
error.info
¶
- {Объект}
Если представить, error.info
— объект с подробной информацией о состоянии ошибки.
error.message
¶
- {нить}
error.message
представляет собой удобочитаемое описание ошибки, предоставляемое системой.
error.path
¶
- {нить}
Если представить, error.path
— строка, содержащая соответствующий недопустимый путь.
error.port
¶
- {количество}
Если представить, error.port
порт сетевого подключения недоступен.
error.syscall
¶
- {нить}
В error.syscall
свойство — это строка, описывающая системный вызов это не удалось.
Общие системные ошибки¶
Это список системных ошибок, которые часто встречаются при написании программы на Node.js. Полный список см. В errno
(3) справочная страница.
-
EACCES
(В разрешении отказано): была сделана попытка получить доступ к файлу способом, запрещенным его разрешениями на доступ к файлу. -
EADDRINUSE
(Адрес уже используется): попытка привязать сервер (net
,http
, илиhttps
) на локальный адрес не удалось из-за того, что другой сервер в локальной системе уже занимает этот адрес. -
ECONNREFUSED
(В соединении отказано): соединение не может быть установлено, потому что целевая машина активно отказалась от него. Обычно это происходит из-за попытки подключиться к неактивной службе на чужом хосте. -
ECONNRESET
(Сброс соединения одноранговым узлом): соединение было принудительно закрыто одноранговым узлом. Обычно это происходит из-за потери соединения с удаленным сокетом из-за тайм-аута или перезагрузки. Обычно встречается черезhttp
а такжеnet
модули. -
EEXIST
(Файл существует): существующий файл был целью операции, которая требовала, чтобы цель не существовала. -
EISDIR
(Является каталогом): операция ожидала файл, но указанный путь был каталогом. -
EMFILE
(Слишком много открытых файлов в системе): максимальное количество файловые дескрипторы допустимый в системе, и запросы для другого дескриптора не могут быть выполнены, пока хотя бы один из них не будет закрыт. Это происходит при одновременном открытии множества файлов одновременно, особенно в системах (в частности, macOS), где существует низкий предел дескрипторов файлов для процессов. Чтобы исправить низкий предел, запуститеulimit -n 2048
в той же оболочке, которая будет запускать процесс Node.js. -
ENOENT
(Нет такого файла или каталога): обычно создаетсяfs
операции, чтобы указать, что компонент указанного пути не существует. По указанному пути не удалось найти ни один объект (файл или каталог). -
ENOTDIR
(Не каталог): компонент с указанным путем существует, но не является каталогом, как ожидалось. Обычно выращиваетсяfs.readdir
. -
ENOTEMPTY
(Каталог не пустой): каталог с записями был целью операции, для которой требуется пустой каталог, обычноfs.unlink
. -
ENOTFOUND
(Ошибка поиска DNS): указывает на сбой DNS либоEAI_NODATA
илиEAI_NONAME
. Это не стандартная ошибка POSIX. -
EPERM
(Операция запрещена): была сделана попытка выполнить операцию, требующую повышенных привилегий. -
EPIPE
(Сломанный канал): запись в канал, сокет или FIFO, для которого нет процесса для чтения данных. Часто встречается наnet
а такжеhttp
Уровни, указывающие на то, что удаленная сторона записываемого потока была закрыта. -
ETIMEDOUT
(Превышено время ожидания операции): запрос на подключение или отправку завершился неудачно, поскольку подключенная сторона не ответила должным образом по прошествии определенного периода времени. Обычно встречаетсяhttp
илиnet
. Часто признак того, чтоsocket.end()
не был должным образом назван.
Класс: TypeError
¶
- Расширяет {errors.Error}
Указывает, что указанный аргумент не является допустимым типом. Например, передача функции параметру, который ожидает строку, будет TypeError
.
require('url').parse(() => {});
// Throws TypeError, since it expected a string.
Node.js сгенерирует и выбросит TypeError
экземпляры немедленно как форма подтверждения аргумента.
Исключения против ошибок¶
Исключение JavaScript — это значение, которое выбрасывается в результате недопустимой операции или как цель throw
утверждение. Хотя не требуется, чтобы эти значения были экземплярами Error
или классы, которые наследуются от Error
, все исключения, создаваемые Node.js или средой выполнения JavaScript буду быть экземплярами Error
.
Некоторые исключения безвозвратно на уровне JavaScript. Такие исключения будут всегда вызвать сбой процесса Node.js. Примеры включают assert()
чеки или abort()
вызывает в слое C ++.
Ошибки OpenSSL¶
Ошибки, возникающие в crypto
или tls
классные Error
, и в дополнение к стандартному .code
а также .message
properties, могут иметь некоторые дополнительные свойства, специфичные для OpenSSL.
error.opensslErrorStack
¶
Массив ошибок, который может дать контекст, откуда в библиотеке OpenSSL возникла ошибка.
error.function
¶
Функция OpenSSL, в которой возникла ошибка.
error.library
¶
Библиотека OpenSSL, в которой возникла ошибка.
error.reason
¶
Строка в удобном для чтения виде, описывающая причину ошибки.
ABORT_ERR
¶
Используется, когда операция была прервана (обычно с использованием AbortController
).
API нет с использованием AbortSignal
s обычно не вызывают ошибки с этим кодом.
Этот код не использует обычный ERR_*
соглашение об ошибках Node.js используется для обеспечения совместимости с веб-платформой. AbortError
.
ERR_AMBIGUOUS_ARGUMENT
¶
Аргумент функции используется таким образом, чтобы предположить, что сигнатура функции может быть неправильно понята. Это брошено assert
модуль, когда message
параметр в assert.throws(block, message)
совпадает с сообщением об ошибке, выданным block
потому что это использование предполагает, что пользователь верит message
ожидаемое сообщение, а не сообщение AssertionError
будет отображаться, если block
не бросает.
ERR_ARG_NOT_ITERABLE
¶
Итерируемый аргумент (т.е. значение, которое работает с for...of
loops) требуется, но не предоставляется API Node.js.
ERR_ASSERTION
¶
Особый тип ошибки, которая может быть вызвана всякий раз, когда Node.js обнаруживает исключительное логическое нарушение, которое никогда не должно происходить. Обычно они поднимаются assert
модуль.
ERR_ASYNC_CALLBACK
¶
Была сделана попытка зарегистрировать что-то, что не является функцией, как AsyncHooks
Перезвоните.
ERR_ASYNC_TYPE
¶
Недопустимый тип асинхронного ресурса. Пользователи также могут определять свои собственные типы при использовании общедоступного API для встраивания.
ERR_BROTLI_COMPRESSION_FAILED
¶
Данные, переданные в поток Brotli, не были успешно сжаты.
ERR_BROTLI_INVALID_PARAM
¶
Во время построения потока Brotli был передан недопустимый ключ параметра.
ERR_BUFFER_CONTEXT_NOT_AVAILABLE
¶
Была сделана попытка создать Node.js Buffer
из кода надстройки или встраивания, находясь в контексте механизма JS, который не связан с экземпляром Node.js. Данные, переданные в Buffer
будет выпущен к тому времени, когда метод вернется.
При возникновении этой ошибки возможная альтернатива созданию Buffer
пример — создать нормальный Uint8Array
, который отличается только прототипом результирующего объекта. Uint8Array
s общеприняты во всех основных API Node.js, где Buffer
s есть; они доступны во всех контекстах.
ERR_BUFFER_OUT_OF_BOUNDS
¶
Операция за пределами Buffer
была предпринята попытка.
ERR_BUFFER_TOO_LARGE
¶
Была сделана попытка создать Buffer
больше максимально допустимого размера.
ERR_CANNOT_WATCH_SIGINT
¶
Node.js не смог отследить SIGINT
сигнал.
ERR_CHILD_CLOSED_BEFORE_REPLY
¶
Дочерний процесс был закрыт до того, как родительский процесс получил ответ.
ERR_CHILD_PROCESS_IPC_REQUIRED
¶
Используется, когда дочерний процесс разветвляется без указания канала IPC.
ERR_CHILD_PROCESS_STDIO_MAXBUFFER
¶
Используется, когда основной процесс пытается прочитать данные из STDERR / STDOUT дочернего процесса, и длина данных больше, чем maxBuffer
вариант.
ERR_CLOSED_MESSAGE_PORT
¶
Была попытка использовать MessagePort
экземпляр в закрытом состоянии, обычно после .close()
был вызван.
ERR_CONSOLE_WRITABLE_STREAM
¶
Console
был создан без stdout
поток, или Console
имеет незаписываемый stdout
или stderr
транслировать.
ERR_CONSTRUCT_CALL_INVALID
¶
Был вызван конструктор класса, который нельзя вызвать.
ERR_CONSTRUCT_CALL_REQUIRED
¶
Конструктор класса был вызван без new
.
ERR_CONTEXT_NOT_INITIALIZED
¶
Контекст vm, переданный в API, еще не инициализирован. Это может произойти при возникновении (и обнаружении) ошибки во время создания контекста, например, при сбое выделения или при достижении максимального размера стека вызовов при создании контекста.
ERR_CRYPTO_CUSTOM_ENGINE_NOT_SUPPORTED
¶
Был запрошен механизм сертификатов клиента, который не поддерживается используемой версией OpenSSL.
ERR_CRYPTO_ECDH_INVALID_FORMAT
¶
Недопустимое значение для format
аргумент был передан crypto.ECDH()
класс getPublicKey()
метод.
ERR_CRYPTO_ECDH_INVALID_PUBLIC_KEY
¶
Недопустимое значение для key
аргумент был передан crypto.ECDH()
класс computeSecret()
метод. Это означает, что открытый ключ лежит за пределами эллиптической кривой.
ERR_CRYPTO_ENGINE_UNKNOWN
¶
Неверный идентификатор криптографической машины был передан в require('crypto').setEngine()
.
ERR_CRYPTO_FIPS_FORCED
¶
В --force-fips
был использован аргумент командной строки, но была попытка включить или отключить режим FIPS в crypto
модуль.
ERR_CRYPTO_FIPS_UNAVAILABLE
¶
Была сделана попытка включить или отключить режим FIPS, но режим FIPS был недоступен.
ERR_CRYPTO_HASH_FINALIZED
¶
hash.digest()
вызвали несколько раз. В hash.digest()
метод должен вызываться не более одного раза для каждого экземпляра Hash
объект.
ERR_CRYPTO_HASH_UPDATE_FAILED
¶
hash.update()
не удалось по какой-либо причине. Это должно происходить редко, если вообще когда-либо случаться.
ERR_CRYPTO_INCOMPATIBLE_KEY
¶
Указанные криптографические ключи несовместимы с предпринятой операцией.
ERR_CRYPTO_INCOMPATIBLE_KEY_OPTIONS
¶
Выбранная кодировка открытого или закрытого ключа несовместима с другими параметрами.
ERR_CRYPTO_INITIALIZATION_FAILED
¶
Не удалось инициализировать криптоподсистему.
ERR_CRYPTO_INVALID_AUTH_TAG
¶
Предоставлен недопустимый тег аутентификации.
ERR_CRYPTO_INVALID_COUNTER
¶
Для шифра режима противодействия предоставлен неверный счетчик.
ERR_CRYPTO_INVALID_CURVE
¶
Была предоставлена неверная эллиптическая кривая.
ERR_CRYPTO_INVALID_DIGEST
¶
Недействительный алгоритм криптодайджеста было указано.
ERR_CRYPTO_INVALID_IV
¶
Предоставлен недопустимый вектор инициализации.
ERR_CRYPTO_INVALID_JWK
¶
Был предоставлен недопустимый веб-ключ JSON.
ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE
¶
Данный тип объекта криптографического ключа недопустим для выполняемой операции.
ERR_CRYPTO_INVALID_KEYLEN
¶
Была предоставлена неверная длина ключа.
ERR_CRYPTO_INVALID_KEYPAIR
¶
Была предоставлена неверная пара ключей.
ERR_CRYPTO_INVALID_KEYTYPE
¶
Предоставлен недопустимый тип ключа.
ERR_CRYPTO_INVALID_MESSAGELEN
¶
Была предоставлена неверная длина сообщения.
ERR_CRYPTO_INVALID_SCRYPT_PARAMS
¶
Были предоставлены неверные параметры алгоритма шифрования.
ERR_CRYPTO_INVALID_STATE
¶
Крипто-метод был использован для объекта, находившегося в недопустимом состоянии. Например, позвонив cipher.getAuthTag()
перед звонком cipher.final()
.
ERR_CRYPTO_INVALID_TAG_LENGTH
¶
Предоставлена неверная длина тега аутентификации.
ERR_CRYPTO_JOB_INIT_FAILED
¶
Не удалось инициализировать асинхронную криптооперацию.
ERR_CRYPTO_JWK_UNSUPPORTED_CURVE
¶
Эллиптическая кривая Ключа не зарегистрирована для использования в Реестр эллиптических кривых веб-ключей JSON.
ERR_CRYPTO_JWK_UNSUPPORTED_KEY_TYPE
¶
Тип асимметричного ключа ключа не зарегистрирован для использования в Реестр типов веб-ключей JSON.
ERR_CRYPTO_OPERATION_FAILED
¶
Криптооперация завершилась неудачно по неустановленной причине.
ERR_CRYPTO_PBKDF2_ERROR
¶
Алгоритм PBKDF2 завершился неудачно по неустановленным причинам. OpenSSL не предоставляет более подробной информации, и, следовательно, Node.js.
ERR_CRYPTO_SCRYPT_INVALID_PARAMETER
¶
Один или больше crypto.scrypt()
или crypto.scryptSync()
параметры находятся за пределами допустимого диапазона.
ERR_CRYPTO_SCRYPT_NOT_SUPPORTED
¶
Node.js был скомпилирован без scrypt
служба поддержки. Невозможно с официальными двоичными файлами выпуска, но может произойти с пользовательскими сборками, включая сборки дистрибутива.
ERR_CRYPTO_SIGN_KEY_REQUIRED
¶
Подпись key
не был предоставлен sign.sign()
метод.
ERR_CRYPTO_TIMING_SAFE_EQUAL_LENGTH
¶
crypto.timingSafeEqual()
был вызван с Buffer
, TypedArray
, или DataView
аргументы разной длины.
ERR_CRYPTO_UNKNOWN_CIPHER
¶
Указан неизвестный шифр.
ERR_CRYPTO_UNKNOWN_DH_GROUP
¶
Было дано неизвестное название группы Диффи-Хеллмана. Видеть crypto.getDiffieHellman()
для списка допустимых имен групп.
ERR_CRYPTO_UNSUPPORTED_OPERATION
¶
Была сделана попытка вызвать неподдерживаемую криптографическую операцию.
ERR_DEBUGGER_ERROR
¶
Произошла ошибка с отладчик.
ERR_DEBUGGER_STARTUP_ERROR
¶
В отладчик истекло время ожидания освобождения необходимого хоста / порта.
ERR_DLOPEN_DISABLED
¶
Загрузка собственных надстроек отключена с помощью --no-addons
.
ERR_DLOPEN_FAILED
¶
Звонок в process.dlopen()
не смогли.
ERR_DIR_CLOSED
¶
В fs.Dir
ранее был закрыт.
ERR_DIR_CONCURRENT_OPERATION
¶
Была предпринята попытка синхронного чтения или закрытия fs.Dir
который имеет текущие асинхронные операции.
ERR_DNS_SET_SERVERS_FAILED
¶
c-ares
не удалось установить DNS-сервер.
ERR_DOMAIN_CALLBACK_NOT_AVAILABLE
¶
В domain
модуль нельзя было использовать, так как он не мог установить требуемые перехватчики обработки ошибок, потому что process.setUncaughtExceptionCaptureCallback()
был вызван в более ранний момент времени.
ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE
¶
process.setUncaughtExceptionCaptureCallback()
нельзя было назвать, потому что domain
модуль был загружен раньше.
Трассировка стека расширяется, чтобы включить момент времени, в который domain
модуль был загружен.
ERR_ENCODING_INVALID_ENCODED_DATA
¶
Данные предоставлены TextDecoder()
API был недопустимым в соответствии с предоставленной кодировкой.
ERR_ENCODING_NOT_SUPPORTED
¶
Кодировка предоставлена TextDecoder()
API не был одним из WHATWG Поддерживаемые кодировки.
ERR_EVAL_ESM_CANNOT_PRINT
¶
--print
не может использоваться с входом ESM.
ERR_EVENT_RECURSION
¶
Вызывается, когда делается попытка рекурсивно отправить событие на EventTarget
.
ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE
¶
Контекст выполнения JS не связан со средой Node.js. Это может произойти, если Node.js используется в качестве встроенной библиотеки и некоторые хуки для движка JS не настроены должным образом.
ERR_FALSY_VALUE_REJECTION
¶
А Promise
это было выполнено обратным вызовом через util.callbackify()
был отклонен с ложным значением.
ERR_FEATURE_UNAVAILABLE_ON_PLATFORM
¶
Используется, когда используется функция, недоступная для текущей платформы, на которой работает Node.js.
ERR_FS_CP_DIR_TO_NON_DIR
¶
Была сделана попытка скопировать каталог в не каталог (файл, символическую ссылку и т. Д.) С помощью fs.cp()
.
ERR_FS_CP_EEXIST
¶
Была сделана попытка скопировать файл, который уже существовал с fs.cp()
, с force
а также errorOnExist
установлен в true
.
ERR_FS_CP_EINVAL
¶
Когда используешь fs.cp()
, src
или dest
указал на недопустимый путь.
ERR_FS_CP_FIFO_PIPE
¶
Была сделана попытка скопировать именованный канал с fs.cp()
.
ERR_FS_CP_NON_DIR_TO_DIR
¶
Была сделана попытка скопировать не каталог (файл, символическую ссылку и т. Д.) В каталог с помощью fs.cp()
.
ERR_FS_CP_SOCKET
¶
Была сделана попытка скопировать в сокет с fs.cp()
.
ERR_FS_CP_SYMLINK_TO_SUBDIRECTORY
¶
Когда используешь fs.cp()
, символическая ссылка в dest
указал на подкаталог src
.
ERR_FS_CP_UNKNOWN
¶
Была сделана попытка скопировать файл неизвестного типа с fs.cp()
.
ERR_FS_EISDIR
¶
Путь — это каталог.
ERR_FS_FILE_TOO_LARGE
¶
Была сделана попытка прочитать файл, размер которого превышает максимально допустимый размер для Buffer
.
ERR_FS_INVALID_SYMLINK_TYPE
¶
Недопустимый тип символической ссылки был передан в fs.symlink()
или fs.symlinkSync()
методы.
Была сделана попытка добавить дополнительные заголовки после того, как они уже были отправлены.
Указано недопустимое значение заголовка HTTP.
ERR_HTTP_INVALID_STATUS_CODE
¶
Код состояния находился за пределами обычного диапазона кодов состояния (100–999).
ERR_HTTP_REQUEST_TIMEOUT
¶
Клиент не отправил весь запрос в отведенное время.
ERR_HTTP_SOCKET_ENCODING
¶
Изменение кодировки сокета запрещено RFC 7230, раздел 3.
ERR_HTTP_TRAILER_INVALID
¶
В Trailer
заголовок был установлен, хотя кодировка передачи не поддерживает это.
ERR_HTTP2_ALTSVC_INVALID_ORIGIN
¶
Для фреймов HTTP / 2 ALTSVC требуется действительное происхождение.
ERR_HTTP2_ALTSVC_LENGTH
¶
Кадры HTTP / 2 ALTSVC ограничены максимум 16 382 байтами полезной нагрузки.
Для запросов HTTP / 2 с использованием CONNECT
метод, :authority
псевдозаголовок обязателен.
ERR_HTTP2_CONNECT_PATH
¶
Для запросов HTTP / 2 с использованием CONNECT
метод, :path
псевдозаголовок запрещен.
ERR_HTTP2_CONNECT_SCHEME
¶
Для запросов HTTP / 2 с использованием CONNECT
метод, :scheme
псевдозаголовок запрещен.
ERR_HTTP2_ERROR
¶
Произошла неспецифическая ошибка HTTP / 2.
ERR_HTTP2_GOAWAY_SESSION
¶
Новые потоки HTTP / 2 нельзя открывать после Http2Session
получил GOAWAY
кадр от подключенного однорангового узла.
Было предоставлено несколько значений для поля заголовка HTTP / 2, которое должно было иметь только одно значение.
Дополнительные заголовки были указаны после того, как был инициирован ответ HTTP / 2.
Была сделана попытка отправить несколько заголовков ответа.
ERR_HTTP2_INFO_STATUS_NOT_ALLOWED
¶
Информационные коды состояния HTTP (1xx
) не может быть установлен в качестве кода состояния ответа в ответах HTTP / 2.
Заголовки соединения HTTP / 1 запрещено использовать в запросах и ответах HTTP / 2.
Указано недопустимое значение заголовка HTTP / 2.
ERR_HTTP2_INVALID_INFO_STATUS
¶
Указан недопустимый информационный код состояния HTTP. Информационные коды состояния должны быть целыми числами между 100
а также 199
(включительно).
ERR_HTTP2_INVALID_ORIGIN
¶
HTTP / 2 ORIGIN
кадры требуют действительного происхождения.
ERR_HTTP2_INVALID_PACKED_SETTINGS_LENGTH
¶
Вход Buffer
а также Uint8Array
экземпляры переданы в http2.getUnpackedSettings()
API должен иметь длину, кратную шести.
Только допустимые псевдозаголовки HTTP / 2 (:status
, :path
, :authority
, :scheme
, а также :method
) может быть использовано.
ERR_HTTP2_INVALID_SESSION
¶
Действие было выполнено с Http2Session
объект, который уже был уничтожен.
ERR_HTTP2_INVALID_SETTING_VALUE
¶
Для параметра HTTP / 2 указано недопустимое значение.
ERR_HTTP2_INVALID_STREAM
¶
Операция была выполнена над потоком, который уже был уничтожен.
ERR_HTTP2_MAX_PENDING_SETTINGS_ACK
¶
Всякий раз, когда HTTP / 2 SETTINGS
фрейм отправляется подключенному одноранговому узлу, одноранговый узел должен отправить подтверждение, что он получил и применил новый SETTINGS
. По умолчанию максимальное количество неподтвержденных SETTINGS
кадры могут быть отправлены в любой момент времени. Этот код ошибки используется при достижении этого предела.
ERR_HTTP2_NESTED_PUSH
¶
Была сделана попытка инициировать новый push-поток из push-потока. Вложенные push-потоки не разрешены.
ERR_HTTP2_NO_MEM
¶
Недостаточно памяти при использовании http2session.setLocalWindowSize(windowSize)
API.
ERR_HTTP2_NO_SOCKET_MANIPULATION
¶
Была предпринята попытка напрямую манипулировать (чтение, запись, пауза, возобновление и т. Д.) Сокетом, подключенным к Http2Session
.
ERR_HTTP2_ORIGIN_LENGTH
¶
HTTP / 2 ORIGIN
кадры ограничены длиной 16382 байта.
ERR_HTTP2_OUT_OF_STREAMS
¶
Количество потоков, созданных в одном сеансе HTTP / 2, достигло максимального предела.
ERR_HTTP2_PAYLOAD_FORBIDDEN
¶
Полезная нагрузка сообщения была указана для кода ответа HTTP, для которого полезная нагрузка запрещена.
ERR_HTTP2_PING_CANCEL
¶
Пинг HTTP / 2 был отменен.
ERR_HTTP2_PING_LENGTH
¶
Полезные данные ping HTTP / 2 должны иметь длину ровно 8 байтов.
Псевдозаголовок HTTP / 2 использован ненадлежащим образом. Псевдо-заголовки — это имена ключей заголовков, которые начинаются с :
приставка.
ERR_HTTP2_PUSH_DISABLED
¶
Была сделана попытка создать push-поток, который был отключен клиентом.
ERR_HTTP2_SEND_FILE
¶
Была сделана попытка использовать Http2Stream.prototype.responseWithFile()
API для отправки каталога.
ERR_HTTP2_SEND_FILE_NOSEEK
¶
Была сделана попытка использовать Http2Stream.prototype.responseWithFile()
API для отправки чего-то другого, кроме обычного файла, но offset
или length
были предоставлены варианты.
ERR_HTTP2_SESSION_ERROR
¶
В Http2Session
закрывается с ненулевым кодом ошибки.
ERR_HTTP2_SETTINGS_CANCEL
¶
В Http2Session
настройки отменены.
ERR_HTTP2_SOCKET_BOUND
¶
Была сделана попытка подключить Http2Session
возражать против net.Socket
или tls.TLSSocket
который уже был привязан к другому Http2Session
объект.
ERR_HTTP2_SOCKET_UNBOUND
¶
Была сделана попытка использовать socket
собственность Http2Session
это уже было закрыто.
ERR_HTTP2_STATUS_101
¶
Использование 101
Информационный код статуса запрещен в HTTP / 2.
ERR_HTTP2_STATUS_INVALID
¶
Указан недопустимый код состояния HTTP. Коды состояния должны быть целыми числами между 100
а также 599
(включительно).
ERR_HTTP2_STREAM_CANCEL
¶
An Http2Stream
был уничтожен до того, как какие-либо данные были переданы подключенному узлу.
ERR_HTTP2_STREAM_ERROR
¶
Ненулевой код ошибки был указан в RST_STREAM
Рамка.
ERR_HTTP2_STREAM_SELF_DEPENDENCY
¶
При установке приоритета для потока HTTP / 2 этот поток может быть помечен как зависимость для родительского потока. Этот код ошибки используется, когда делается попытка пометить поток и зависит от него самого.
ERR_HTTP2_TOO_MANY_INVALID_FRAMES
¶
Предел приемлемых недопустимых кадров протокола HTTP / 2, отправленных партнером, как указано в maxSessionInvalidFrames
вариант, был превышен.
ERR_HTTP2_TRAILERS_ALREADY_SENT
¶
Конечные заголовки уже отправлены на Http2Stream
.
ERR_HTTP2_TRAILERS_NOT_READY
¶
В http2stream.sendTrailers()
метод не может быть вызван до тех пор, пока 'wantTrailers'
событие испускается на Http2Stream
объект. В 'wantTrailers'
событие будет сгенерировано только в том случае, если waitForTrailers
опция установлена для Http2Stream
.
ERR_HTTP2_UNSUPPORTED_PROTOCOL
¶
http2.connect()
был передан URL-адрес, использующий любой протокол, кроме http:
или https:
.
ERR_ILLEGAL_CONSTRUCTOR
¶
Была предпринята попытка построить объект с использованием закрытого конструктора.
ERR_INCOMPATIBLE_OPTION_PAIR
¶
Пара опций несовместима друг с другом и не может использоваться одновременно.
ERR_INPUT_TYPE_NOT_ALLOWED
¶
Стабильность: 1 — экспериментальная
В --input-type
Флаг использовался для попытки выполнить файл. Этот флаг можно использовать только при вводе через --eval
, --print
или STDIN
.
ERR_INSPECTOR_ALREADY_ACTIVATED
¶
При использовании inspector
module была предпринята попытка активировать инспектор, когда он уже начал прослушивать порт. Использовать inspector.close()
прежде чем активировать его на другом адресе.
ERR_INSPECTOR_ALREADY_CONNECTED
¶
При использовании inspector
модуль, была предпринята попытка подключения, когда инспектор уже был подключен.
ERR_INSPECTOR_CLOSED
¶
При использовании inspector
модуля, была предпринята попытка использовать инспектор после того, как сессия уже закрылась.
ERR_INSPECTOR_COMMAND
¶
Произошла ошибка при подаче команды через inspector
модуль.
ERR_INSPECTOR_NOT_ACTIVE
¶
В inspector
не активен, когда inspector.waitForDebugger()
называется.
ERR_INSPECTOR_NOT_AVAILABLE
¶
В inspector
модуль недоступен для использования.
ERR_INSPECTOR_NOT_CONNECTED
¶
При использовании inspector
модуль, была предпринята попытка использовать инспектор до его подключения.
ERR_INSPECTOR_NOT_WORKER
¶
В основном потоке был вызван API, который можно использовать только из рабочего потока.
ERR_INTERNAL_ASSERTION
¶
Ошибка в Node.js или некорректное использование внутренних компонентов Node.js. Чтобы исправить ошибку, откройте проблему на https://github.com/nodejs/node/issues.
ERR_INVALID_ADDRESS_FAMILY
¶
Указанное семейство адресов не распознается API Node.js.
ERR_INVALID_ARG_TYPE
¶
В API Node.js был передан аргумент неправильного типа.
ERR_INVALID_ARG_VALUE
¶
Для данного аргумента было передано недопустимое или неподдерживаемое значение.
ERR_INVALID_ASYNC_ID
¶
Недействительный asyncId
или triggerAsyncId
был передан с использованием AsyncHooks
. Идентификатор меньше -1 никогда не должен происходить.
ERR_INVALID_BUFFER_SIZE
¶
Обмен был произведен на Buffer
но его размер был несовместим с операцией.
ERR_INVALID_CALLBACK
¶
Требовалась функция обратного вызова, но она не была предоставлена API Node.js.
ERR_INVALID_CHAR
¶
В заголовках обнаружены недопустимые символы.
ERR_INVALID_CURSOR_POS
¶
Курсор в данном потоке нельзя переместить в указанную строку без указанного столбца.
ERR_INVALID_FD
¶
Дескриптор файла (‘fd’) недействителен (например, имеет отрицательное значение).
ERR_INVALID_FD_TYPE
¶
Недопустимый тип дескриптора файла (‘fd’).
ERR_INVALID_FILE_URL_HOST
¶
API-интерфейс Node.js, который потребляет file:
URL-адреса (например, определенные функции в fs
module) обнаружил URL-адрес файла с несовместимым хостом. Эта ситуация может возникнуть только в Unix-подобных системах, где только localhost
или поддерживается пустой хост.
ERR_INVALID_FILE_URL_PATH
¶
API-интерфейс Node.js, который потребляет file:
URL-адреса (например, определенные функции в fs
module) обнаружил URL-адрес файла с несовместимым путем. Точная семантика для определения возможности использования пути зависит от платформы.
ERR_INVALID_HANDLE_TYPE
¶
Была сделана попытка отправить неподдерживаемый «дескриптор» по каналу связи IPC дочернему процессу. Видеть subprocess.send()
а также process.send()
для дополнительной информации.
ERR_INVALID_HTTP_TOKEN
¶
Предоставлен недопустимый токен HTTP.
ERR_INVALID_IP_ADDRESS
¶
IP-адрес недействителен.
ERR_INVALID_MODULE
¶
Была сделана попытка загрузить несуществующий или недействительный модуль.
ERR_INVALID_MODULE_SPECIFIER
¶
Строка импортированного модуля является недопустимым URL-адресом, именем пакета или указателем подпути пакета.
ERR_INVALID_PACKAGE_CONFIG
¶
Недействительный package.json
файл не прошел синтаксический анализ.
ERR_INVALID_PACKAGE_TARGET
¶
В package.json
"exports"
Поле содержит недопустимое значение сопоставления цели для попытки разрешения модуля.
ERR_INVALID_PERFORMANCE_MARK
¶
При использовании Performance Timing API (perf_hooks
), отметка о производительности недействительна.
ERR_INVALID_PROTOCOL
¶
Недействительный options.protocol
был передан http.request()
.
ERR_INVALID_REPL_EVAL_CONFIG
¶
Оба breakEvalOnSigint
а также eval
параметры были установлены в REPL
config, который не поддерживается.
ERR_INVALID_REPL_INPUT
¶
Вход не может использоваться в REPL
. Условия, при которых используется эта ошибка, описаны в REPL
документация.
ERR_INVALID_RETURN_PROPERTY
¶
Выбрасывается в случае, если параметр функции не предоставляет допустимое значение для одного из свойств возвращаемого объекта при выполнении.
ERR_INVALID_RETURN_PROPERTY_VALUE
¶
Выбрасывается в случае, если параметр функции не предоставляет тип ожидаемого значения для одного из свойств возвращаемого объекта при выполнении.
ERR_INVALID_RETURN_VALUE
¶
Вызывается в случае, если опция функции не возвращает ожидаемый тип значения при выполнении, например, когда ожидается, что функция вернет обещание.
ERR_INVALID_STATE
¶
Указывает, что операция не может быть завершена из-за недопустимого состояния. Например, объект может быть уже уничтожен или может выполнять другую операцию.
ERR_INVALID_SYNC_FORK_INPUT
¶
А Buffer
, TypedArray
, DataView
или string
был предоставлен как вход stdio для асинхронной вилки. См. Документацию по child_process
модуль для получения дополнительной информации.
ERR_INVALID_THIS
¶
Функция API Node.js была вызвана с несовместимым this
ценить.
const urlSearchParams = new URLSearchParams(
'foo=bar&baz=new'
);
const buf = Buffer.alloc(1);
urlSearchParams.has.call(buf, 'foo');
// Throws a TypeError with code 'ERR_INVALID_THIS'
ERR_INVALID_TRANSFER_OBJECT
¶
Недопустимый объект передачи был передан в postMessage()
.
ERR_INVALID_TUPLE
¶
Элемент в iterable
предоставлен WHATWG URLSearchParams
конструктор не представлял [name, value]
кортеж — то есть, если элемент не повторяется или не состоит ровно из двух элементов.
ERR_INVALID_URI
¶
Передан неверный URI.
ERR_INVALID_URL
¶
Недействительный URL был передан в WHATWG URL
конструктор или наследие url.parse()
быть разобранным. Выброшенный объект ошибки обычно имеет дополнительное свойство 'input'
который содержит URL-адрес, который не удалось проанализировать.
ERR_INVALID_URL_SCHEME
¶
Была сделана попытка использовать URL несовместимой схемы (протокола) для определенной цели. Он используется только в WHATWG URL API поддержка в fs
модуль (который принимает только URL-адреса с 'file'
схема), но может использоваться и в других API Node.js в будущем.
ERR_IPC_CHANNEL_CLOSED
¶
Была сделана попытка использовать канал связи IPC, который уже был закрыт.
ERR_IPC_DISCONNECTED
¶
Была сделана попытка отключить уже отключенный канал связи IPC. См. Документацию по child_process
модуль для получения дополнительной информации.
ERR_IPC_ONE_PIPE
¶
Была предпринята попытка создать дочерний процесс Node.js, использующий более одного канала связи IPC. См. Документацию по child_process
модуль для получения дополнительной информации.
ERR_IPC_SYNC_FORK
¶
Была предпринята попытка открыть канал связи IPC с помощью синхронно разветвленного процесса Node.js. См. Документацию по child_process
модуль для получения дополнительной информации.
ERR_MANIFEST_ASSERT_INTEGRITY
¶
Была предпринята попытка загрузить ресурс, но ресурс не соответствовал целостности, определенной в манифесте политики. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_DEPENDENCY_MISSING
¶
Была предпринята попытка загрузить ресурс, но ресурс не был указан как зависимость от расположения, в котором его пытались загрузить. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_INTEGRITY_MISMATCH
¶
Была сделана попытка загрузить манифест политики, но в манифесте было несколько записей для ресурса, которые не совпадали друг с другом. Обновите записи манифеста, чтобы они соответствовали, чтобы устранить эту ошибку. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_INVALID_RESOURCE_FIELD
¶
Ресурс манифеста политики имел недопустимое значение для одного из полей. Обновите запись манифеста, чтобы она соответствовала, чтобы устранить эту ошибку. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_INVALID_SPECIFIER
¶
Ресурс манифеста политики имел недопустимое значение для одного из сопоставлений зависимостей. Обновите запись манифеста, чтобы она соответствовала разрешению этой ошибки. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_PARSE_POLICY
¶
Была предпринята попытка загрузить манифест политики, но не удалось проанализировать манифест. Документацию для политика манифесты для получения дополнительной информации.
ERR_MANIFEST_TDZ
¶
Была предпринята попытка чтения из манифеста политики, но инициализация манифеста еще не произошла. Вероятно, это ошибка в Node.js.
ERR_MANIFEST_UNKNOWN_ONERROR
¶
Манифест политики был загружен, но для его поведения «onerror» было неизвестно значение. Документацию для политика манифесты для получения дополнительной информации.
ERR_MEMORY_ALLOCATION_FAILED
¶
Была предпринята попытка выделить память (обычно на уровне C ++), но она не удалась.
ERR_MESSAGE_TARGET_CONTEXT_UNAVAILABLE
¶
Сообщение отправлено MessagePort
не удалось десериализовать в целевой vm Context
. Не все объекты Node.js могут быть успешно созданы в любом контексте в настоящее время, и попытки передать их с помощью postMessage()
в этом случае может выйти из строя принимающая сторона.
ERR_METHOD_NOT_IMPLEMENTED
¶
Метод требуется, но не реализован.
ERR_MISSING_ARGS
¶
Не был передан обязательный аргумент API Node.js. Это используется только для строгого соответствия спецификации API (которая в некоторых случаях может принимать func(undefined)
но нет func()
). В большинстве собственных API-интерфейсов Node.js func(undefined)
а также func()
рассматриваются одинаково, а ERR_INVALID_ARG_TYPE
вместо этого можно использовать код ошибки.
ERR_MISSING_OPTION
¶
Для API-интерфейсов, которые принимают объекты параметров, некоторые параметры могут быть обязательными. Этот код выдается, если отсутствует необходимая опция.
ERR_MISSING_PASSPHRASE
¶
Была сделана попытка прочитать зашифрованный ключ без указания ключевой фразы.
ERR_MISSING_PLATFORM_FOR_WORKER
¶
Платформа V8, используемая этим экземпляром Node.js, не поддерживает создание рабочих. Это вызвано отсутствием поддержки Embedder для Workers. В частности, эта ошибка не возникает при использовании стандартных сборок Node.js.
ERR_MISSING_TRANSFERABLE_IN_TRANSFER_LIST
¶
Объект, который должен быть явно указан в transferList
аргумент находится в объекте, переданном в postMessage()
звоните, но не указано в transferList
для этого звонка. Обычно это MessagePort
.
В версиях Node.js до v15.0.0 использованный здесь код ошибки был ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST
. Однако набор переносимых типов объектов был расширен, чтобы охватить больше типов, чем MessagePort
.
ERR_MODULE_NOT_FOUND
¶
Стабильность: 1 — экспериментальная
An Модуль ES не может быть решен.
ERR_MULTIPLE_CALLBACK
¶
Обратный звонок был вызван более одного раза.
Обратный вызов почти всегда предназначен для однократного вызова, поскольку запрос может быть выполнен или отклонен, но не оба одновременно. Последнее станет возможным, если вызвать обратный вызов более одного раза.
ERR_NAPI_CONS_FUNCTION
¶
При использовании Node-API
, переданный конструктор не является функцией.
ERR_NAPI_INVALID_DATAVIEW_ARGS
¶
Во время звонка napi_create_dataview()
, данный offset
находился за пределами окна просмотра данных или offset + length
был больше, чем длина заданного buffer
.
ERR_NAPI_INVALID_TYPEDARRAY_ALIGNMENT
¶
Во время звонка napi_create_typedarray()
предоставленные offset
не был кратен размеру элемента.
ERR_NAPI_INVALID_TYPEDARRAY_LENGTH
¶
Во время звонка napi_create_typedarray()
, (length * size_of_element) + byte_offset
был больше, чем длина заданного buffer
.
ERR_NAPI_TSFN_CALL_JS
¶
Произошла ошибка при вызове части JavaScript поточно-ориентированной функции.
ERR_NAPI_TSFN_GET_UNDEFINED
¶
Произошла ошибка при попытке получить код JavaScript. undefined
ценить.
ERR_NAPI_TSFN_START_IDLE_LOOP
¶
В основном потоке значения удаляются из очереди, связанной с поточно-ориентированной функцией, в цикле ожидания. Эта ошибка указывает на то, что произошла ошибка при попытке запустить цикл.
ERR_NAPI_TSFN_STOP_IDLE_LOOP
¶
Если в очереди больше не осталось элементов, цикл простоя должен быть приостановлен. Эта ошибка указывает на то, что не удалось остановить цикл холостого хода.
ERR_NO_CRYPTO
¶
Была предпринята попытка использовать функции шифрования, пока Node.js не был скомпилирован с поддержкой шифрования OpenSSL.
ERR_NO_ICU
¶
Была предпринята попытка использовать функции, требующие ICU, но Node.js не был скомпилирован с поддержкой ICU.
ERR_NON_CONTEXT_AWARE_DISABLED
¶
Родной аддон, не зависящий от контекста, был загружен в процессе, который их запрещает.
ERR_OUT_OF_RANGE
¶
Заданное значение выходит за пределы допустимого диапазона.
ERR_PACKAGE_IMPORT_NOT_DEFINED
¶
В package.json
"imports"
поле не определяет заданное отображение спецификатора внутреннего пакета.
ERR_PACKAGE_PATH_NOT_EXPORTED
¶
В package.json
"exports"
не экспортирует запрошенный подпуть. Поскольку экспорт инкапсулирован, частные внутренние модули, которые не экспортируются, не могут быть импортированы через разрешение пакета, если не используется абсолютный URL-адрес.
ERR_PERFORMANCE_INVALID_TIMESTAMP
¶
Для отметки производительности или показателя было предоставлено недопустимое значение метки времени.
ERR_PERFORMANCE_MEASURE_INVALID_OPTIONS
¶
Предусмотрены недопустимые варианты измерения производительности.
ERR_PROTO_ACCESS
¶
Доступ Object.prototype.__proto__
было запрещено использовать --disable-proto=throw
. Object.getPrototypeOf
а также Object.setPrototypeOf
следует использовать для получения и установки прототипа объекта.
ERR_REQUIRE_ESM
¶
Стабильность: 1 — экспериментальная
Была сделана попытка require()
ан Модуль ES.
ERR_SCRIPT_EXECUTION_INTERRUPTED
¶
Выполнение скрипта было прервано SIGINT
(Например, Ctrl+C был нажат.)
ERR_SCRIPT_EXECUTION_TIMEOUT
¶
Истекло время выполнения сценария, возможно, из-за ошибок в выполняемом сценарии.
ERR_SERVER_ALREADY_LISTEN
¶
В server.listen()
метод был вызван в то время как net.Server
уже слушал. Это относится ко всем экземплярам net.Server
, включая HTTP, HTTPS и HTTP / 2 Server
экземпляры.
ERR_SERVER_NOT_RUNNING
¶
В server.close()
метод был вызван, когда net.Server
не работал. Это относится ко всем экземплярам net.Server
, включая HTTP, HTTPS и HTTP / 2 Server
экземпляры.
ERR_SOCKET_ALREADY_BOUND
¶
Была сделана попытка привязать уже связанный сокет.
ERR_SOCKET_BAD_BUFFER_SIZE
¶
Был передан недопустимый (отрицательный) размер для recvBufferSize
или sendBufferSize
варианты в dgram.createSocket()
.
ERR_SOCKET_BAD_PORT
¶
Функция API, ожидающая порта> = 0 и <65536, получила недопустимое значение.
ERR_SOCKET_BAD_TYPE
¶
Функция API, ожидающая типа сокета (udp4
или udp6
) получил недопустимое значение.
ERR_SOCKET_BUFFER_SIZE
¶
При использовании dgram.createSocket()
, размер получения или отправки Buffer
не может быть определено.
ERR_SOCKET_CLOSED
¶
Была сделана попытка работать с уже закрытым сокетом.
ERR_SOCKET_DGRAM_IS_CONNECTED
¶
А dgram.connect()
вызов был сделан на уже подключенном сокете.
ERR_SOCKET_DGRAM_NOT_CONNECTED
¶
А dgram.disconnect()
или dgram.remoteAddress()
звонок был сделан на отключенной розетке.
ERR_SOCKET_DGRAM_NOT_RUNNING
¶
Был сделан вызов, но подсистема UDP не работала.
ERR_SRI_PARSE
¶
Строка была предоставлена для проверки целостности подресурса, но не может быть проанализирована. Проверьте формат атрибутов целостности, посмотрев на Спецификация целостности подресурсов.
ERR_STREAM_ALREADY_FINISHED
¶
Был вызван метод потока, который не может быть завершен, поскольку поток был завершен.
ERR_STREAM_CANNOT_PIPE
¶
Была сделана попытка позвонить stream.pipe()
на Writable
транслировать.
ERR_STREAM_DESTROYED
¶
Был вызван метод потока, который не может быть завершен, поскольку поток был уничтожен с использованием stream.destroy()
.
ERR_STREAM_NULL_VALUES
¶
Была сделана попытка позвонить stream.write()
с null
кусок.
ERR_STREAM_PREMATURE_CLOSE
¶
Ошибка, возвращенная stream.finished()
а также stream.pipeline()
, когда поток или конвейер завершаются некорректно, без явной ошибки.
ERR_STREAM_PUSH_AFTER_EOF
¶
Была сделана попытка позвонить stream.push()
после null
(EOF) был отправлен в поток.
ERR_STREAM_UNSHIFT_AFTER_END_EVENT
¶
Была сделана попытка позвонить stream.unshift()
после 'end'
событие было отправлено.
ERR_STREAM_WRAP
¶
Предотвращает прерывание, если строковый декодер был установлен на Socket или если декодер находится в objectMode
.
const Socket = require('net').Socket;
const instance = new Socket();
instance.setEncoding('utf8');
ERR_STREAM_WRITE_AFTER_END
¶
Была сделана попытка позвонить stream.write()
после stream.end()
был вызван.
ERR_STRING_TOO_LONG
¶
Была сделана попытка создать строку длиннее максимально допустимой.
ERR_SYNTHETIC
¶
Искусственный объект ошибки, используемый для захвата стека вызовов для диагностических отчетов.
ERR_SYSTEM_ERROR
¶
В процессе Node.js произошла неопределенная или неспецифическая системная ошибка. Объект ошибки будет иметь err.info
свойство объекта с дополнительной информацией.
ERR_TLS_CERT_ALTNAME_INVALID
¶
При использовании TLS имя хоста / IP-адрес однорангового узла не соответствует ни одному из subjectAltNames
в его сертификате.
ERR_TLS_DH_PARAM_SIZE
¶
При использовании TLS параметр, предлагаемый для алгоритма Диффи-Хеллмана (DH
) протокол согласования ключей слишком мал. По умолчанию длина ключа должна быть больше или равна 1024 битам, чтобы избежать уязвимостей, хотя настоятельно рекомендуется использовать 2048 бит или больше для большей безопасности.
ERR_TLS_HANDSHAKE_TIMEOUT
¶
Время ожидания подтверждения TLS / SSL истекло. В этом случае сервер также должен прервать соединение.
ERR_TLS_INVALID_CONTEXT
¶
Контекст должен быть SecureContext
.
ERR_TLS_INVALID_PROTOCOL_METHOD
¶
Указанный secureProtocol
метод недействителен. Он либо неизвестен, либо отключен, потому что небезопасен.
ERR_TLS_INVALID_PROTOCOL_VERSION
¶
Допустимые версии протокола TLS: 'TLSv1'
, 'TLSv1.1'
, или 'TLSv1.2'
.
ERR_TLS_INVALID_STATE
¶
Сокет TLS должен быть подключен и надежно установлен. Перед продолжением убедитесь, что «безопасное» событие запущено.
ERR_TLS_PROTOCOL_VERSION_CONFLICT
¶
Попытка установить протокол TLS minVersion
или maxVersion
конфликтует с попыткой установить secureProtocol
явно. Используйте тот или иной механизм.
ERR_TLS_PSK_SET_IDENTIY_HINT_FAILED
¶
Не удалось установить подсказку идентификатора PSK. Подсказка может быть слишком длинной.
ERR_TLS_RENEGOTIATION_DISABLED
¶
Была сделана попытка повторно согласовать TLS на экземпляре сокета с отключенным TLS.
ERR_TLS_REQUIRED_SERVER_NAME
¶
При использовании TLS server.addContext()
был вызван без указания имени хоста в первом параметре.
ERR_TLS_SESSION_ATTACK
¶
Обнаружено чрезмерное количество повторных согласований TLS, что является потенциальным вектором атак типа «отказ в обслуживании».
ERR_TLS_SNI_FROM_SERVER
¶
Была предпринята попытка выдать указание имени сервера из сокета на стороне сервера TLS, который действителен только для клиента.
ERR_TRACE_EVENTS_CATEGORY_REQUIRED
¶
В trace_events.createTracing()
требуется по крайней мере одна категория событий трассировки.
ERR_TRACE_EVENTS_UNAVAILABLE
¶
В trace_events
модуль не может быть загружен, потому что Node.js был скомпилирован с --without-v8-platform
флаг.
ERR_TRANSFORM_ALREADY_TRANSFORMING
¶
А Transform
поток завершился, пока он все еще преобразовывался.
ERR_TRANSFORM_WITH_LENGTH_0
¶
А Transform
поток закончился с данными, все еще находящимися в буфере записи.
ERR_TTY_INIT_FAILED
¶
Инициализация TTY не удалась из-за системной ошибки.
ERR_UNAVAILABLE_DURING_EXIT
¶
Функция была вызвана в process.on('exit')
обработчик, который не должен вызываться внутри process.on('exit')
обработчик.
ERR_UNCAUGHT_EXCEPTION_CAPTURE_ALREADY_SET
¶
process.setUncaughtExceptionCaptureCallback()
был вызван дважды, без предварительного сброса обратного вызова на null
.
Эта ошибка предназначена для предотвращения случайной перезаписи обратного вызова, зарегистрированного из другого модуля.
ERR_UNESCAPED_CHARACTERS
¶
Получена строка, содержащая неэкранированные символы.
ERR_UNHANDLED_ERROR
¶
Произошла необработанная ошибка (например, когда 'error'
событие испускается EventEmitter
но 'error'
обработчик не зарегистрирован).
ERR_UNKNOWN_BUILTIN_MODULE
¶
Используется для определения определенного вида внутренней ошибки Node.js, которая обычно не должна запускаться кодом пользователя. Экземпляры этой ошибки указывают на внутреннюю ошибку в самом двоичном файле Node.js.
ERR_UNKNOWN_CREDENTIAL
¶
Был передан несуществующий идентификатор группы или пользователя Unix.
ERR_UNKNOWN_ENCODING
¶
В API передан неверный или неизвестный параметр кодировки.
ERR_UNKNOWN_FILE_EXTENSION
¶
Стабильность: 1 — экспериментальная
Была сделана попытка загрузить модуль с неизвестным или неподдерживаемым расширением файла.
ERR_UNKNOWN_MODULE_FORMAT
¶
Стабильность: 1 — экспериментальная
Была сделана попытка загрузить модуль с неизвестным или неподдерживаемым форматом.
ERR_UNKNOWN_SIGNAL
¶
Неверный или неизвестный сигнал процесса был передан API, ожидающему действительного сигнала (например, subprocess.kill()
).
ERR_UNSUPPORTED_DIR_IMPORT
¶
import
URL-адрес каталога не поддерживается. Вместо, Самостоятельная ссылка на пакет, используя его имя а также определить настраиваемый подпуть в "exports"
поле package.json
файл.
import './'; // unsupported
import './index.js'; // supported
import 'package-name'; // supported
ERR_UNSUPPORTED_ESM_URL_SCHEME
¶
import
со схемами URL, отличными от file
а также data
не поддерживается.
ERR_VALID_PERFORMANCE_ENTRY_TYPE
¶
При использовании Performance Timing API (perf_hooks
) допустимые типы записей производительности не найдены.
ERR_VM_DYNAMIC_IMPORT_CALLBACK_MISSING
¶
Обратный вызов динамического импорта не указан.
ERR_VM_MODULE_ALREADY_LINKED
¶
Модуль, который пытались связать, не подходит для связывания по одной из следующих причин:
- Он уже был связан (
linkingStatus
является'linked'
) - Это связано (
linkingStatus
является'linking'
) - Не удалось установить связь для этого модуля (
linkingStatus
является'errored'
)
ERR_VM_MODULE_CACHED_DATA_REJECTED
¶
В cachedData
Параметр, переданный конструктору модуля, недопустим.
ERR_VM_MODULE_CANNOT_CREATE_CACHED_DATA
¶
Кэшированные данные не могут быть созданы для модулей, которые уже были оценены.
ERR_VM_MODULE_DIFFERENT_CONTEXT
¶
Модуль, возвращаемый функцией компоновщика, находится в другом контексте, чем родительский модуль. Связанные модули должны иметь общий контекст.
ERR_VM_MODULE_LINKING_ERRORED
¶
Функция компоновщика вернула модуль, для которого не удалось выполнить связывание.
ERR_VM_MODULE_LINK_FAILURE
¶
Модуль не удалось связать из-за сбоя.
ERR_VM_MODULE_NOT_MODULE
¶
Выполненное значение обещания связывания не является vm.Module
объект.
ERR_VM_MODULE_STATUS
¶
Текущий статус модуля не позволяет выполнить эту операцию. Конкретный смысл ошибки зависит от конкретной функции.
ERR_WASI_ALREADY_STARTED
¶
Экземпляр WASI уже запущен.
ERR_WASI_NOT_STARTED
¶
Экземпляр WASI не запущен.
ERR_WORKER_INIT_FAILED
¶
В Worker
Ошибка инициализации.
ERR_WORKER_INVALID_EXEC_ARGV
¶
В execArgv
вариант передан в Worker
конструктор содержит недопустимые флаги.
ERR_WORKER_NOT_RUNNING
¶
Операция завершилась неудачно, потому что Worker
экземпляр в настоящее время не запущен.
ERR_WORKER_OUT_OF_MEMORY
¶
В Worker
Экземпляр остановлен, поскольку достиг предела памяти.
ERR_WORKER_PATH
¶
Путь для основного скрипта рабочего не является ни абсолютным, ни относительным путем, начинающимся с ./
или ../
.
ERR_WORKER_UNSERIALIZABLE_ERROR
¶
Все попытки сериализации неперехваченного исключения из рабочего потока завершились неудачно.
ERR_WORKER_UNSUPPORTED_OPERATION
¶
Запрошенная функциональность не поддерживается в рабочих потоках.
ERR_ZLIB_INITIALIZATION_FAILED
¶
Создание zlib
сбой объекта из-за неправильной конфигурации.
Получено слишком много данных заголовка HTTP. Для защиты от злонамеренных или неправильно настроенных клиентов, если получено более 8 КБ данных HTTP-заголовка, анализ HTTP будет прерван без создания объекта запроса или ответа, и Error
с этим кодом будет выпущен.
HPE_UNEXPECTED_CONTENT_LENGTH
¶
Сервер отправляет как Content-Length
заголовок и Transfer-Encoding: chunked
.
Transfer-Encoding: chunked
позволяет серверу поддерживать постоянное соединение HTTP для динамически генерируемого контента. В этом случае Content-Length
Заголовок HTTP использовать нельзя.
Использовать Content-Length
или Transfer-Encoding: chunked
.
MODULE_NOT_FOUND
¶
Не удалось разрешить файл модуля при попытке require()
или import
операция.
Устаревшие коды ошибок Node.js¶
Стабильность: 0 — Не рекомендуется. Эти коды ошибок либо несовместимы, либо были удалены.
ERR_CANNOT_TRANSFER_OBJECT
¶
Значение, переданное в postMessage()
содержит объект, который не поддерживается для передачи.
ERR_CRYPTO_HASH_DIGEST_NO_UTF16
¶
Кодировка UTF-16 использовалась с hash.digest()
. В то время как hash.digest()
метод позволяет encoding
аргумент, который должен быть передан, в результате чего метод возвращает строку, а не Buffer
, кодировка UTF-16 (например, ucs
или utf16le
) не поддерживается.
ERR_HTTP2_FRAME_ERROR
¶
Используется при сбое отправки отдельного кадра в сеансе HTTP / 2.
Используется, когда ожидается объект заголовков HTTP / 2.
Используется, когда в сообщении HTTP / 2 отсутствует требуемый заголовок.
Информационные заголовки HTTP / 2 должны отправляться только прежний позвонить в Http2Stream.prototype.respond()
метод.
ERR_HTTP2_STREAM_CLOSED
¶
Используется, когда действие было выполнено над уже закрытым потоком HTTP / 2.
ERR_HTTP_INVALID_CHAR
¶
Используется, когда в сообщении статуса ответа HTTP (фраза причины) обнаружен недопустимый символ.
ERR_INDEX_OUT_OF_RANGE
¶
Данный индекс был вне допустимого диапазона (например, отрицательные смещения).
ERR_INVALID_OPT_VALUE
¶
В объект опций было передано недопустимое или неожиданное значение.
ERR_INVALID_OPT_VALUE_ENCODING
¶
Передана неверная или неизвестная кодировка файла.
ERR_MISSING_MESSAGE_PORT_IN_TRANSFER_LIST
¶
Этот код ошибки был заменен на ERR_MISSING_TRANSFERABLE_IN_TRANSFER_LIST
в Node.js v15.0.0, потому что он больше не точен, поскольку теперь существуют и другие типы переносимых объектов.
ERR_NAPI_CONS_PROTOTYPE_OBJECT
¶
Используется Node-API
когда Constructor.prototype
не объект.
ERR_NO_LONGER_SUPPORTED
¶
API Node.js был вызван неподдерживаемым способом, например Buffer.write(string, encoding, offset[, length])
.
ERR_OPERATION_FAILED
¶
Не удалось выполнить операцию. Обычно это используется, чтобы сигнализировать об общем сбое асинхронной операции.
ERR_OUTOFMEMORY
¶
Обычно используется для определения того, что операция вызвала нехватку памяти.
ERR_PARSE_HISTORY_DATA
¶
В repl
модулю не удалось проанализировать данные из файла истории REPL.
ERR_SOCKET_CANNOT_SEND
¶
Данные не могут быть отправлены через сокет.
ERR_STDERR_CLOSE
¶
Была сделана попытка закрыть process.stderr
транслировать. По замыслу Node.js не позволяет stdout
или stderr
потоки должны быть закрыты кодом пользователя.
ERR_STDOUT_CLOSE
¶
Была сделана попытка закрыть process.stdout
транслировать. По замыслу Node.js не позволяет stdout
или stderr
потоки должны быть закрыты кодом пользователя.
ERR_STREAM_READ_NOT_IMPLEMENTED
¶
Используется, когда делается попытка использовать читаемый поток, который не реализован readable._read()
.
ERR_TLS_RENEGOTIATION_FAILED
¶
Используется, когда запрос на повторное согласование TLS завершился ошибкой неспецифическим образом.
ERR_TRANSFERRING_EXTERNALIZED_SHAREDARRAYBUFFER
¶
А SharedArrayBuffer
чья память не управляется механизмом JavaScript или Node.js. во время сериализации. Такой SharedArrayBuffer
не может быть сериализован.
Это может произойти только тогда, когда нативные аддоны создают SharedArrayBuffer
s в «внешнем» режиме или поместите существующий SharedArrayBuffer
во внешний режим.
ERR_UNKNOWN_STDIN_TYPE
¶
Была предпринята попытка запустить процесс Node.js с неизвестным stdin
тип файла. Эта ошибка обычно указывает на ошибку в самом Node.js, хотя пользовательский код может вызвать ее.
ERR_UNKNOWN_STREAM_TYPE
¶
Была предпринята попытка запустить процесс Node.js с неизвестным stdout
или stderr
тип файла. Эта ошибка обычно указывает на ошибку в самом Node.js, хотя пользовательский код может вызвать ее.
ERR_V8BREAKITERATOR
¶
V8 BreakIterator
API использовался, но не установлен полный набор данных ICU.
ERR_VALUE_OUT_OF_RANGE
¶
Используется, когда заданное значение выходит за пределы допустимого диапазона.
ERR_VM_MODULE_NOT_LINKED
¶
Перед созданием экземпляра модуль должен быть успешно связан.
ERR_WORKER_UNSUPPORTED_EXTENSION
¶
Имя пути, используемое для основного сценария рабочего, имеет неизвестное расширение файла.
ERR_ZLIB_BINDING_CLOSED
¶
Используется, когда делается попытка использовать zlib
объект после того, как он уже был закрыт.
ERR_CPU_USAGE
¶
Родной звонок от process.cpuUsage
не может быть обработано.