如何使用try catch捕获回调错误?

时间:2019-01-19 05:15:42

标签: javascript async-await try-catch

我有一个异步功能,可以抓取文件内容,如下所示:

async function getFile (name) {
  return new Promise(function (resolve, reject) {
    fs.readFile(`./dir/${name}.txt`, 'utf8', function (error, file) {
      if (error) reject(error)
      else resolve(file)
    })
  })
}

然后我将该功能调用到控制台日志中

getFile('name').then( console.log )

如果我犯了一个错误,例如拼写错误的文件名,我会得到这个方便的错误:

(node:17246) UnhandledPromiseRejectionWarning: Unhandled promise
rejection. This error originated either by throwing inside of an async 
function without a catch block, or by rejecting a promise which was not 
handled with .catch(). (rejection id: 1)

我可以通过以下方法对其进行修复:

getFile('name').then( console.log ).catch( console.log ),但是有没有办法处理回调中的错误?也许尝试一下?我该怎么办?

2 个答案:

答案 0 :(得分:2)

您仍然需要捕获rejected的错误。

我认为您是在其中调用getFile函数的地方-需要包装在try/catch块中

try {
  const result = await getFile('name')
} catch(e) {
  ... You should see rejected errors here
}

或者,我认为这将适用于您的示例:

await getFile('name').then( console.log ).catch(e => {...})

在Chrome DevTools控制台中对此进行测试:

async function test () {
  return new Promise(function(resolve, reject) {
    throw 'this is an error';
  })
}

并通过以下方式调用它:

await test().catch(e => alert(e))

表明这确实有效!

答案 1 :(得分:1)

如果我的理解正确,那么无论您是否遇到错误,都希望函数能够解析。如果是这样,则无论哪种情况都可以resolve

async function getFile (name) {
  return new Promise(function (resolve, reject) {
    fs.readFile(`./dir/${name}.txt`, 'utf8', function (error, file) {
      if (error) resolve(error)
      else resolve(file)
    })
  })
}

然后,您需要处理外部错误,例如

getFile('name')
  .then(getFileOutput => {
    if (getFileOutput instanceof Error) {
      // we got an error
    } else {
      // we got a file
    }
  })

const getFileOutput = await getFile('name');
if (getFileOutput instanceof Error) {
  // we got an error
} else {
  // we got a file
}

这是您要找的吗?