Here's some code:
import 'babel-polyfill'
async function helloWorld () {
throw new Error ('hi')
}
helloWorld()
I also went deep and tried this as well:
import 'babel-polyfill'
async function helloWorld () {
throw new Error ('hi')
}
async function main () {
try {
await helloWorld()
} catch (e) {
throw e
}
}
main()
and:
import 'babel-polyfill'
async function helloWorld () {
throw new Error ('hi')
}
try {
helloWorld()
} catch (e) {
throw e
}
This works:
import 'babel-polyfill'
async function helloWorld () {
throw new Error('xxx')
}
helloWorld()
.catch(console.log.bind(console))
So it's kind of tricky, but the reason you're not catching the error is because, at the top level, the entire script can be thought of as a synchronous function. Anything you want to catch asynchronously needs to be wrapped in an
async
function or using Promises.So for instance, this will swallow errors:
Because it's the same as this:
At the top level, you should always add a normal Promise-style catch() to make sure that your errors get handled:
In Node, there is also the global
unhandledRejection
event on process that you can use to catch all Promise errors.async
is meant to be used with Promises. If you reject the promise, then you cancatch
the error, if you resolve the promise, that becomes the return value of the function.