С кодом выше исключение из nestedFunc2
определенно будет поймано этим блоком try
/ catch
.
Я подозреваю, что то, что у вас действительно есть, является исключением в асинхронный обратный вызов :
try {
someNodeAPIFunction((err, result) => {
// Exception thrown here
});
} catch (e) {
console.log(e);
}
Если это так, то да, вполне нормально, что try
/ catch
там не перехватывает исключение, потому что этот код уже завершен. Обратный вызов называется , позже . Единственное, что может перехватить исключение, это код в someNodeAPIFunction
, который вызывает обратный вызов.
Это одна из причин, по которой API-интерфейсам обратного вызова неудобно работать.
В любом неопределенном Последняя версия Node.js, вы можете использовать async
/ await
, чтобы упростить вещи. Node.js предоставляет версии с поддержкой Promise некоторых из его функций API (в частности, модуль fs.promises
), а также предоставляет служебную функцию promisify
, которую можно использовать для включения стандартного Node.js функция в стиле обратного вызова в функцию, которая возвращает обещание. Так, например, с помощью приведенного выше:
const someNodeAPIFunctionPromisified = util.promisify(someNodeAPIFunction);
Затем в функции async
вы можете сделать это:
try {
const result = await someNodeAPIFunctionPromisified();
// Exception thrown here
} catch (e) {
console.log(e);
}
... и исключение будет перехвачено, потому что функции async
позволяют корректировать логический поток кода даже при работе с асинхронными результатами.
Подробнее о async
функциях в MDN .