summaryrefslogtreecommitdiff
path: root/doc/api
diff options
context:
space:
mode:
authorRuben Bridgewater <ruben@bridgewater.de>2018-05-17 16:25:36 +0200
committerMichaƫl Zasso <targos@protonmail.com>2019-05-09 18:43:57 +0200
commitc78de13238444d0b91607bff49195c38da669ce5 (patch)
tree0879282355f2721d03ea9da3140b64eeab7e70db /doc/api
parent815a95734e99ab0ac6c82163ad5699308ef1e2ff (diff)
downloadnode-new-c78de13238444d0b91607bff49195c38da669ce5.tar.gz
repl: handle uncaughtException properly
When running the REPL as standalone program it's now possible to use `process.on('uncaughtException', listener)`. It is going to use those listeners from now on and the regular error output is suppressed. It also fixes the issue that REPL instances started inside of an application would silence all application errors. It is now prohibited to add the exception listener in such REPL instances. Trying to add such listeners throws an `ERR_INVALID_REPL_INPUT` error. Fixes: https://github.com/nodejs/node/issues/19998 PR-URL: https://github.com/nodejs/node/pull/27151 Fixes: https://github.com/nodejs/node/issues/19998 Reviewed-By: Lance Ball <lball@redhat.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
Diffstat (limited to 'doc/api')
-rw-r--r--doc/api/errors.md11
-rw-r--r--doc/api/repl.md34
2 files changed, 42 insertions, 3 deletions
diff --git a/doc/api/errors.md b/doc/api/errors.md
index 2cb4bc067e..9420e07b16 100644
--- a/doc/api/errors.md
+++ b/doc/api/errors.md
@@ -1310,8 +1310,14 @@ An invalid `options.protocol` was passed to `http.request()`.
<a id="ERR_INVALID_REPL_EVAL_CONFIG"></a>
### ERR_INVALID_REPL_EVAL_CONFIG
-Both `breakEvalOnSigint` and `eval` options were set in the REPL config, which
-is not supported.
+Both `breakEvalOnSigint` and `eval` options were set in the [`REPL`][] config,
+which is not supported.
+
+<a id="ERR_INVALID_REPL_INPUT"></a>
+### ERR_INVALID_REPL_INPUT
+
+The input may not be used in the [`REPL`][]. All prohibited inputs are
+documented in the [`REPL`][]'s documentation.
<a id="ERR_INVALID_RETURN_PROPERTY"></a>
### ERR_INVALID_RETURN_PROPERTY
@@ -2307,6 +2313,7 @@ such as `process.stdout.on('data')`.
[`Class: assert.AssertionError`]: assert.html#assert_class_assert_assertionerror
[`ERR_INVALID_ARG_TYPE`]: #ERR_INVALID_ARG_TYPE
[`EventEmitter`]: events.html#events_class_eventemitter
+[`REPL`]: repl.html
[`Writable`]: stream.html#stream_class_stream_writable
[`child_process`]: child_process.html
[`cipher.getAuthTag()`]: crypto.html#crypto_cipher_getauthtag
diff --git a/doc/api/repl.md b/doc/api/repl.md
index e0ec27b7e3..563817c632 100644
--- a/doc/api/repl.md
+++ b/doc/api/repl.md
@@ -138,16 +138,47 @@ global or scoped variable, the input `fs` will be evaluated on-demand as
```
#### Global Uncaught Exceptions
+<!-- YAML
+changes:
+ - version: REPLACEME
+ pr-url: https://github.com/nodejs/node/pull/27151
+ description: The `'uncaughtException'` event is from now on triggered if the
+ repl is used as standalone program.
+-->
The REPL uses the [`domain`][] module to catch all uncaught exceptions for that
REPL session.
This use of the [`domain`][] module in the REPL has these side effects:
-* Uncaught exceptions do not emit the [`'uncaughtException'`][] event.
+* Uncaught exceptions only emit the [`'uncaughtException'`][] event if the
+ `repl` is used as standalone program. If the `repl` is included anywhere in
+ another application, adding a listener for this event will throw an
+ [`ERR_INVALID_REPL_INPUT`][] exception.
* Trying to use [`process.setUncaughtExceptionCaptureCallback()`][] throws
an [`ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE`][] error.
+As standalone program:
+
+```js
+process.on('uncaughtException', () => console.log('Uncaught'));
+
+throw new Error('foobar');
+// Uncaught
+```
+
+When used in another application:
+
+```js
+process.on('uncaughtException', () => console.log('Uncaught'));
+// TypeError [ERR_INVALID_REPL_INPUT]: Listeners for `uncaughtException`
+// cannot be used in the REPL
+
+throw new Error('foobar');
+// Thrown:
+// Error: foobar
+```
+
#### Assignment of the `_` (underscore) variable
<!-- YAML
changes:
@@ -661,6 +692,7 @@ For an example of running a REPL instance over [curl(1)][], see:
[`'uncaughtException'`]: process.html#process_event_uncaughtexception
[`--experimental-repl-await`]: cli.html#cli_experimental_repl_await
[`ERR_DOMAIN_CANNOT_SET_UNCAUGHT_EXCEPTION_CAPTURE`]: errors.html#errors_err_domain_cannot_set_uncaught_exception_capture
+[`ERR_INVALID_REPL_INPUT`]: errors.html#errors_err_invalid_repl_input
[`domain`]: domain.html
[`process.setUncaughtExceptionCaptureCallback()`]: process.html#process_process_setuncaughtexceptioncapturecallback_fn
[`readline.InterfaceCompleter`]: readline.html#readline_use_of_the_completer_function