Skip to content

JavaScript: Error handling with Promises and Async/Await

dbigpot on October 11, 2019

Error handling in JavaScript can be easy while being tricky at certain places, especially Promises. JS allows error handling with the help of try, ... [Read Full]
markdown guide

Very useful, thank you :) I was just a bit confused by this statement, it seems to contradict itself?:

"But the problem with the above module is that when we throw a new Error inside the then block of the promise, it will always pass to the catch block of the promise. That is because throwing a new error inside a then block of a promise will always be passed to the catch block of the invoking promise function."


I think the catch block it was referring to is the catch block right after the then block. But the goal was to have a single catch block do all the error handling but from that code, it had two catch blocks ( 1. for module errors, 2. for promise/then errors )


@fluffystark pretty much answers your question. However, I'll explain it further just in case -

Say you have a promise function called somePromise. When you do a throw new Error() inside your .then() block, like below

try {
        .then((data) => {
            throw new Error('Inner error');
        .catch((promiseError) => {
            console.log(promiseError); // Prints Inner error
} catch (error) {
    // Handle all module errors here

the error will get passed to the .catch() block of somePromise() and not the catch block of the try-catch.

When having multiple promise statements in your code, it can become cumbersome to handle each promise's errors in its own .catch() block. Using async/await allows you to handle all errors in one place. I hope this cleared your doubt. :)


Thanks for writing this! Using promises as a wrapper around logic that could fail is a useful pattern. You can also listen for promise errors globally (rather than attaching a catch to each one) using the unhandledrejection global event.

It’s also important to log these sort of failures back to a service like TrackJS to help you understand when things fail in production.


Somewhat off-topic, async/await were introduced in ES8 not ES6.

code of conduct - report abuse