【问题标题】:How to catch error from promise (node js)如何从 Promise 中捕获错误(node js)
【发布时间】:2019-02-08 11:58:28
【问题描述】:
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
    }
};

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

【问题讨论】:

标签: node.js


【解决方案1】:

promise 中抛出或拒绝的错误可以被.catch() 方法捕获。 Try/catch 不适用于异步代码。

你可以像这样使用它:

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

更多详情,请查看针对相同问题的其他stackoverflow answers

【讨论】:

    【解决方案2】:

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

    • 对于同步代码,使用 try / catch
    • 对于异步代码,请避免尝试/捕获,因为它不起作用并使用回调(错误,数据)或 Promise 拒绝样式
    • 如果您使用的是新的 ES7 语法 await/sync,那么您可以使用 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;
      });
    };
    

    【讨论】:

      【解决方案3】:

      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 */
          });
      

      【讨论】:

        【解决方案4】:

        对于您的情况,如果您在 new 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
           }
         };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-21
          • 1970-01-01
          • 2020-04-17
          • 1970-01-01
          • 1970-01-01
          • 2018-01-14
          相关资源
          最近更新 更多