summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/internal/main/worker_thread.js40
-rw-r--r--test/parallel/test-worker-non-fatal-uncaught-exception.js25
2 files changed, 46 insertions, 19 deletions
diff --git a/lib/internal/main/worker_thread.js b/lib/internal/main/worker_thread.js
index 90e84f204b..50a19be77d 100644
--- a/lib/internal/main/worker_thread.js
+++ b/lib/internal/main/worker_thread.js
@@ -166,26 +166,28 @@ function workerOnGlobalUncaughtException(error, fromPromise) {
}
debug(`[${threadId}] uncaught exception handled = ${handled}`);
- if (!handled) {
- let serialized;
- try {
- const { serializeError } = require('internal/error-serdes');
- serialized = serializeError(error);
- } catch {}
- debug(`[${threadId}] uncaught exception serialized = ${!!serialized}`);
- if (serialized)
- port.postMessage({
- type: ERROR_MESSAGE,
- error: serialized
- });
- else
- port.postMessage({ type: COULD_NOT_SERIALIZE_ERROR });
-
- const { clearAsyncIdStack } = require('internal/async_hooks');
- clearAsyncIdStack();
-
- process.exit();
+ if (handled) {
+ return true;
}
+
+ let serialized;
+ try {
+ const { serializeError } = require('internal/error-serdes');
+ serialized = serializeError(error);
+ } catch {}
+ debug(`[${threadId}] uncaught exception serialized = ${!!serialized}`);
+ if (serialized)
+ port.postMessage({
+ type: ERROR_MESSAGE,
+ error: serialized
+ });
+ else
+ port.postMessage({ type: COULD_NOT_SERIALIZE_ERROR });
+
+ const { clearAsyncIdStack } = require('internal/async_hooks');
+ clearAsyncIdStack();
+
+ process.exit();
}
// Patch the global uncaught exception handler so it gets picked up by
diff --git a/test/parallel/test-worker-non-fatal-uncaught-exception.js b/test/parallel/test-worker-non-fatal-uncaught-exception.js
new file mode 100644
index 0000000000..01df55eec1
--- /dev/null
+++ b/test/parallel/test-worker-non-fatal-uncaught-exception.js
@@ -0,0 +1,25 @@
+'use strict';
+const common = require('../common');
+const assert = require('assert');
+const { Worker } = require('worker_threads');
+
+// Check that `process._fatalException()` returns a boolean when run inside a
+// worker.
+
+// Do not use isMainThread so that this test itself can be run inside a Worker.
+if (!process.env.HAS_STARTED_WORKER) {
+ process.env.HAS_STARTED_WORKER = 1;
+ const w = new Worker(__filename);
+ w.on('exit', common.mustCall((code) => {
+ assert.strictEqual(code, 0);
+ }));
+ return;
+}
+
+process.once('uncaughtException', () => {
+ process.nextTick(() => {
+ assert.strictEqual(res, true);
+ });
+});
+
+const res = process._fatalException(new Error());