如何从Promise中捕获错误(Node JS)

时间:2018-09-03 12:09:45

标签: node.js

let commandPromise = async (command) => {
    try {
        return new Promise((resolve, reject) => {
            try {
                child_process.exec(command, (error, stdout, stderr) => {
                    if (error) return reject(error);
                    if (stderr) return reject(stderr);
                    return resolve(stdout)
                })
            } catch (err) {
                return reject(err)
            }
        })
    } catch (err) {
        throw err
    }
};

在这种情况下捕获错误是正确的方法还是存在更好的方法?代码似乎不好。

4 个答案:

答案 0 :(得分:2)

对于您的情况,如果在新的Promise()之前添加“ await”,一切都会奏效

 let commandPromise = async (command) => {
   try {
       return await new Promise((resolve, reject) => {
           try {
               child_process.exec(command, (error, stdout, stderr) => {
                   if (error) return reject(error);
                   if (stderr) return reject(stderr);
                   return resolve(stdout)
               })
           } catch (err) {
               return reject(err)
           }
       })
   } catch (err) {
       throw err
   }
 };

答案 1 :(得分:1)

您在这里缺少概念,但这是黄金法则:

  • 有关同步代码,请使用try / catch
  • 对于异步代码,请避免尝试/捕获,因为它不起作用,请使用回调(错误,数据)或Promise拒绝样式笔
  • 如果您正在使用新的ES7语法等待/同步,则可以使用try / catch

在您的代码上,这是一种简单的方法:

const commandPromise = async (command) => {
  return new Promise((resolve, reject) => {
    child_process.exec(command, (error, stdout, stderr) => {
        if (error) {
          return reject(error);
        }

        if (stderr) {
          return reject(stderr);
        }

        return resolve(stdout)
    });
  });
};

ES7方式:

const commandPromise = async function(command) {  
  child_process.exec(command, (error, stdout, stderr) => {
      if (error) {
        throw error;
      }

      if (stderr) {
        throw stderr;
      }

      return stdout;
  });
};

答案 2 :(得分:1)

try - catch中的两个块都是不必要的,您可以摆脱它们。
此外,由于commandPromise不使用await关键字,因此您也可以从函数声明中删除async关键字。
执行child_process时发生的任何错误都将作为error传递到您的代码已处理的回调中。

这是更好的代码:

let commandPromise = (command) =>
    new Promise((resolve, reject) => {
        child_process.exec(command, (error, stdout, stderr) => {
            if (error) return reject(error);
            if (stderr) return reject(stderr);
            return resolve(stdout);
        });
    });

并使用它:

commandPromise(/* some command */)
    .then(() => {
        /* ok */
    })
    .catch((error) => {
        /* handle error */
    });

答案 3 :(得分:0)

通过.catch()方法可以捕获在诺言中抛出或拒绝的错误。尝试/捕获不适用于异步代码。

您可以像这样使用它:

promise.catch(function(err) {
    // do something
})

有关更多详细信息,请参见针对同一问题的其他stackoverflow answers