Catching Errors In JavaScript Promises With A First Level Try ... Catch


Answer :

You cannot use try-catch statements to handle exceptions thrown asynchronously, as the function has "returned" before any exception is thrown. You should instead use the promise.then and promise.catch methods, which represent the asynchronous equivalent of the try-catch statement. (Or use the async/await syntax noted in @Edo's answer.)

What you need to do is to return the promise, then chain another .catch to it:

function promise() {     var promise = new Promise(function(resolve, reject) {         throw('Oh no!');     });      return promise.catch(function(error) {         throw(error);     }); }  promise().catch(function(error) {     console.log('Caught!', error); }); 

Promises are chainable, so if a promise rethrows an error, it will be delegated down to the next .catch.

By the way, you don't need to use parentheses around throw statements (throw a is the same as throw(a)).


With the new async/await syntax you can achieve this. Please note that at the moment of writing this is not supported by all browsers, you probably need to transpile your code with babel (or something similar).

// Because of the "async" keyword here, calling getSomeValue() // will return a promise. async function getSomeValue() {   if (somethingIsNotOk) {     throw new Error('uh oh');   } else {     return 'Yay!';   } }  async function() {   try {     // "await" will wait for the promise to resolve or reject     // if it rejects, an error will be thrown, which you can     // catch with a regular try/catch block     const someValue = await getSomeValue();     doSomethingWith(someValue);   } catch (error) {     console.error(error);   } } 

No! That's completely impossible, as promises are inherently asynchronous. The try-catch clause will have finished execution when the exception is thrown (and time travel still will not have been invented).

Instead, return promises from all your functions, and hook an error handler on them.


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?