Ответ 1
Асинхронные методы, подобные одному из вашего примера, обычно вызывают ошибки программиста, такие как плохие параметры, и они вызывают обратный вызов с ошибкой для операционных ошибок.
Но есть также асинхронные функции в ES2017 (объявленные с помощью async function
) и эти ошибки сигнала, отклоняя обещание, которое они возвращают, - которые превращаются в исключение, когда вы используете их с ключевым словом await
.
Примеры:
function x(arg, cb) {
if (!arg) throw new Error('Programmer error: bad arguments');
setTimeout(() => {
cb(new Error('Operational error: something bad happened'));
}, 2000);
}
Теперь, когда вы используете его, вы обычно не хотите обрабатывать ошибки программиста - вы хотите их исправить. Поэтому вы не делаете этого:
try {
x();
} catch (err) {
// Why should I handle the case of bad invocation
// instead of fixing it?
}
И операционные ошибки, которые вы обрабатываете следующим образом:
x(function (err) {
if (err) {
// handle error
} else {
// success
}
});
Теперь, если у вас есть функция, которая не выполняет обратный вызов, но возвращает обещание:
function y() {
return new Promise((res, rej) => setTimeout(() => rej('error'), 2000));
}
Затем вы обрабатываете ошибку следующим образом:
y().catch(error => {
// handle error
});
или, используя await
:
try {
await y();
} catch (err) {
// handle error
}
Для получения дополнительной информации о различии между операционными ошибками и ошибками программиста см.:
- Рекомендации по обработке ошибок в Node.js от Dave Pacheco
- Обработка ошибок в Node.js
Для получения дополнительной информации о promises и async
/await
см. ссылки в этом ответе.