Catch all unhandled javascript promise rejections

JavascriptEs6 Promise

Javascript Problem Overview


I would like to catch all unhandled exceptions/rejections that take place within a javascript Promise. Is there a good method for catching them without adding a .catch(..) on each end of the Promise chain? (in case of forgetting to add this, the error silently disappears).

The developer console in Google Chrome can log them, I like to log them as well in a production environment.

For normal javascript exceptions I use the window.onerror function, but the errors from a Promise call this function.

Example:

window.onerror = function (e) {
    alert("unhandled error: " + e);
};

var p = new Promise(function (resolve, reject) {
    var nullObject = null;
    // Raise a TypeError: Cannot read property 'forceNullError' of null
    var x = nullObject.forceNullError(); 
    resolve();
});

p.then(function () { alert('success'); });

JSFiddle: https://jsfiddle.net/f7zwej6L/

*) I noticed that WinJS has a .done(..) method for what I want, but Native Promises don't.

Javascript Solutions


Solution 1 - Javascript

The whole world is waiting for the unhandledrejection and rejectionhandled events. As of March 2016, Chrome is now the first to support it.

Example:

window.addEventListener('unhandledrejection', function(event) {
    console.error('Unhandled rejection (promise: ', event.promise, ', reason: ', event.reason, ').');
});

Specification: HTML Living Standard

Mozilla Developer: onrejectionhandled, onunhandledrejection

Chromium Issues: 495801, 393913

Solution 2 - Javascript

Note that in Node the event is called unhandledRejection:

process.on('unhandledRejection', function(err, promise) {
    console.error('Unhandled rejection (promise: ', promise, ', reason: ', err, ').');
});

On version 12+, node will terminate on these rejections.

Solution 3 - Javascript

Some libraries have their own APIs for doing this. Some browsers will report unhandled rejections (sooner or later).

Actually, done probably does not do what you want. This is why it is not part of the spec. In any case, you still have to remember to call it.

There is no reliable, cross-platform, cross-library way to do this.

Solution 4 - Javascript

uncaught library can help you to catch unhandled promise rejections.

And it handles uncaught errors as well.

EDIT

<script type="text/javascript" src=".../uncaught/lib/index.js"></script>

<script type="text/javascript">
    uncaught.start();
    uncaught.addListener(function (error) {
        console.log('Uncaught error or rejection: ', error.message);
    });
</script>

Benefit of this approach is the only one interface, which allows you to handle both uncaught errors and unhandled promise rejections.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionPeter MolsView Question on Stackoverflow
Solution 1 - JavascriptValentin SherginView Answer on Stackoverflow
Solution 2 - JavascriptBenjamin GruenbaumView Answer on Stackoverflow
Solution 3 - Javascriptuser663031View Answer on Stackoverflow
Solution 4 - JavascriptAleksandr OleynikovView Answer on Stackoverflow