- From: Kevin Smith <zenparsing@gmail.com>
- Date: Mon, 21 Oct 2013 12:40:41 -0400
- To: es-discuss <es-discuss@mozilla.org>, "public-script-coord@w3.org" <public-script-coord@w3.org>
- Message-ID: <CA+mDt2xEfpryMeiR3AV6cO8x4=vHGDfpiNtAm3C-XOrCs6sg8Q@mail.gmail.com>
A well-known problem with Promises, as implemented in various Javascript libraries, is that program errors are silenced by default. Consider the following program, which simply makes an HTTP request and then prints out the HTTP response headers: fetchUri("http://someauthority.com/").then(response => { for (let header of repsonse.heders) // Note the misspelling! console.log(header.key, header.value); }); On line 2, the property "headers" is misspelled, which should cause the program to report an unhandled error. Under the current Promises specification, however, the error will be silenced and the program will end happily with success. Various solutions have been proposed for dealing with this problem, such as: - Extending debugging tools so that unhandled rejections are visible through a specialized tab or view. - Using the garbage collector to determine when rejections can no longer be handled, and therefore constitute a program error. - Adding a `done` method to the promise type which propagates rejections as program errors. While each of these approaches provides a partial solution to the problem, they are ultimately inadequate because they do not address the underlying cause. The root cause of this issue is that, as currently specified, **the problem of determining whether a particular runtime error has an associated handler is Turing undecidable**. This is *not* a desirable property for an error handling mechanism to have, and it is not a design choice that can be reversed at a later date. In order to make error handling decidable, it is sufficient to require that an error handler must be attached to the promise *within a well-defined window*. One such window would be the lifetime of the currently executing user call stack. The designers of Dart have made a similar decision with their Future API. In the following document, users are instructed to register error handlers "early": https://www.dartlang.org/articles/futures-and-error-handling/#potential-problem-failing-to-register-error-handlers-early A quick search on StackOverflow relating to Futures and "early" error handling in Dart yielded no results. This cursory evidence suggests that requiring early registration of error handlers is not a significant problem for Dart users. In my view, it would be a mistake to standardize the undecidable error handling model of current Promises design. Thanks, { Kevin }
Received on Monday, 21 October 2013 16:41:09 UTC