简体   繁体   中英

How to catch a callback error with a try catch?

I have an async function that grabs the contents of a file, like so:

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)
    })
  })
}

And I call that function into a console log

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

If I make an error, like misspelling the file name, I get this handy error:

(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)

I can fix it by doing this:

getFile('name').then( console.log ).catch( console.log ) but is there a way to deal with the error within the callback? Perhaps a try catch? How would I do that?

You still need to catch errors that are rejected .

I think it's where you call your getFile function from - that needs to be wrapped in a try/catch block

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

Or, I think this would work for your example:

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

Testing this in the Chrome DevTools console:

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

And calling it via the following:

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

Shows that this does, in fact, work!

If I understand correctly, you want your function to resolve regardless of whether you got and error or not. If so you can just resolve in either case:

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)
    })
  })
}

Then you'd need to handle the errors outside, eg

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

or

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

Is that what you're looking for?

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM