попробуйте / поймайте проблемы с вложенными функциями в javascript - PullRequest
0 голосов
/ 13 января 2020

У меня есть сценарий, подобный приведенному ниже:

try {
   top();
} catch(e) {
   console.log(e);
}

function top() {
    nestedFunc1();
}

function nestedFunc1() {
    nestedFunc2();
}

function nestedFunc2() {
 // this function throws an exception.
}

мой блок catch не выполняется при возникновении исключения в моем скрипте узла. Ожидается ли такое поведение, или я что-то здесь упускаю.

1 Ответ

1 голос
/ 13 января 2020

С кодом выше исключение из 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 .

...