Do you have false positives when automating with protractor ?
Asynchronous code can be really annoying sometimes, callback pyramids, error handling on every second line, promises swallowing errors by default…
When using ES6 promises any exception which is thrown within a then or a catch handler, will be silently disposed of unless manually handled.
If you are not getting the errors, you are probably coding the promise something like this:
Promise.resolve('promised value').then(function() { throw new Error('error'); });
Then the more obvious way to print the error is adding a catch after the promise:
Promise.resolve('promised value').then(function() { throw new Error('error'); }).catch(function(error) { console.error(error.stack); });
Remember that you need to add this after all the promises you want to print the error. Do you really think this is reliable ? Are you going to repeat yourself adding a catch after all the promises ?
So, how can you print the error without need to repeat yourself when creating a promise ? You can use .done instead of .then. This will run the promise and after print the error that you want.
Here is how you can avoid them:
Promise.resolve('promised value').done(function() { throw new Error('error'); });
But what do you do when you chain multiple thens ?
There is a library called Bluebird which has a fix integrating your existing code by extending the ES6 Promises API. You can make sure you know about unhandled rejections, so no more false positives.
Promise.onPossiblyUnhandledRejection(function(error){ throw error; });
Then if you want to discard an exception not because it is been swallowed, but you don’t need to print it, you can do something like this:
Promise.reject('error value').catch(function() {
});