Объект Error в Node.js содержит несколько важных полей, каждое из которых служит определенной цели для отладки и обработки ошибок. Разберем каждое из них подробно.
Назначение: Человекочитаемое описание ошибки.
try {
throw new Error('Файл не найден');
} catch (err) {
console.log(err.message); // "Файл не найден"
}
Особенности:
Назначение: Машинно-читаемый идентификатор ошибки.
const fs = require('fs');
fs.readFile('несуществующий-файл', (err) => {
console.log(err.code); // "ENOENT"
});
Типичные коды в Node.js:
ENOENT
- файл или директория не существуетECONNREFUSED
- соединение отклоненоERR_INVALID_ARG_TYPE
- неверный тип аргументаПреимущества:
Назначение: Трассировка стека вызовов до момента создания ошибки.
function a() { b(); }
function b() { c(); }
function c() { throw new Error('Ошибка!'); }
try {
a();
} catch (err) {
console.log(err.stack);
}
Вывод будет содержать:
Особенности:
Назначение: Ссылка на оригинальную ошибку при цепочке ошибок.
async function fetchData() {
try {
await fetch('https://api.example.com');
} catch (err) {
throw new Error('Не удалось загрузить данные', { cause: err });
}
}
try {
await fetchData();
} catch (err) {
console.log('Ошибка:', err.message);
console.log('Причина:', err.cause.message);
}
Преимущества:
fs.readFile('config.json', (err, data) => {
if (err) {
if (err.code === 'ENOENT') {
// Создать файл с настройками по умолчанию
} else if (err.code === 'EACCES') {
// Ошибка прав доступа
} else {
// Неизвестная ошибка
}
}
});
app.use((err, req, res, next) => {
logger.error({
message: err.message,
code: err.code,
stack: err.stack,
cause: err.cause
});
res.status(500).send('Internal Server Error');
});
class DatabaseError extends Error {
constructor(message, query) {
super(message);
this.code = 'DB_QUERY_ERROR';
this.query = query;
}
}
try {
throw new DatabaseError('Invalid query', 'SELECT * FROM non_existing');
} catch (err) {
console.log(err instanceof DatabaseError); // true
console.log(err.code); // "DB_QUERY_ERROR"
}
Характеристика | Встроенные объекты | Хост-объекты | Пользовательские объекты |
---|---|---|---|
Источник | Спецификация JavaScript | Среда выполнения | Код разработчика |
Поведение | Стандартизировано | Зависит от окружения | Определяется разработчиком |
Расширяемость | Да | Частично | Да |
Примеры | Array, Date | window, document | Любые созданные объекты |
Каждое поле объекта Error в Node.js решает свою задачу. message
описывает проблему, code
идентифицирует тип ошибки программно, stack
помогает в отладке, а cause
сохраняет контекст при цепочке ошибок. Правильное использование этих полей значительно улучшает обработку и диагностику ошибок в приложениях.