mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 15:04:11 -05:00
fix: report exceptions from nextTick (#26579)
Fixes: https://github.com/denoland/deno/issues/24713 Fixes: https://github.com/denoland/deno/issues/25855
This commit is contained in:
parent
f61af864df
commit
4e38fbd0a3
8 changed files with 72 additions and 4 deletions
|
@ -62,6 +62,8 @@ export function processTicksAndRejections() {
|
||||||
callback(...args);
|
callback(...args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (e) {
|
||||||
|
reportError(e);
|
||||||
} finally {
|
} finally {
|
||||||
// FIXME(bartlomieju): Deno currently doesn't support async hooks
|
// FIXME(bartlomieju): Deno currently doesn't support async hooks
|
||||||
// if (destroyHooksExist())
|
// if (destroyHooksExist())
|
||||||
|
|
|
@ -212,3 +212,7 @@ itest!(unhandled_rejection_web_process {
|
||||||
envs: env_vars_for_npm_tests(),
|
envs: env_vars_for_npm_tests(),
|
||||||
http_server: true,
|
http_server: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
// The itest macro is deprecated. Please move your new test to ~/tests/specs.
|
||||||
|
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||||
|
|
|
@ -43,9 +43,6 @@
|
||||||
// TODO(littledivy): windows ipc streams not yet implemented
|
// TODO(littledivy): windows ipc streams not yet implemented
|
||||||
"test-child-process-fork-ref.js",
|
"test-child-process-fork-ref.js",
|
||||||
"test-child-process-fork-ref2.js",
|
"test-child-process-fork-ref2.js",
|
||||||
// TODO(bartlomieju): this test is very flaky on CI
|
|
||||||
// https://github.com/denoland/deno/issues/25855
|
|
||||||
// "test-child-process-ipc-next-tick.js",
|
|
||||||
"test-child-process-ipc.js",
|
"test-child-process-ipc.js",
|
||||||
"test-child-process-spawnsync-env.js",
|
"test-child-process-spawnsync-env.js",
|
||||||
"test-child-process-stdio-inherit.js",
|
"test-child-process-stdio-inherit.js",
|
||||||
|
@ -240,6 +237,7 @@
|
||||||
"test-child-process-execfilesync-maxbuf.js",
|
"test-child-process-execfilesync-maxbuf.js",
|
||||||
"test-child-process-execsync-maxbuf.js",
|
"test-child-process-execsync-maxbuf.js",
|
||||||
"test-child-process-flush-stdio.js",
|
"test-child-process-flush-stdio.js",
|
||||||
|
"test-child-process-ipc-next-tick.js",
|
||||||
"test-child-process-kill.js",
|
"test-child-process-kill.js",
|
||||||
"test-child-process-set-blocking.js",
|
"test-child-process-set-blocking.js",
|
||||||
"test-child-process-spawn-args.js",
|
"test-child-process-spawn-args.js",
|
||||||
|
|
|
@ -280,7 +280,6 @@ NOTE: This file should not be manually edited. Please edit `tests/node_compat/co
|
||||||
- [parallel/test-child-process-fork3.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-fork3.js)
|
- [parallel/test-child-process-fork3.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-fork3.js)
|
||||||
- [parallel/test-child-process-http-socket-leak.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-http-socket-leak.js)
|
- [parallel/test-child-process-http-socket-leak.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-http-socket-leak.js)
|
||||||
- [parallel/test-child-process-internal.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-internal.js)
|
- [parallel/test-child-process-internal.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-internal.js)
|
||||||
- [parallel/test-child-process-ipc-next-tick.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-ipc-next-tick.js)
|
|
||||||
- [parallel/test-child-process-ipc.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-ipc.js)
|
- [parallel/test-child-process-ipc.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-ipc.js)
|
||||||
- [parallel/test-child-process-no-deprecation.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-no-deprecation.js)
|
- [parallel/test-child-process-no-deprecation.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-no-deprecation.js)
|
||||||
- [parallel/test-child-process-pipe-dataflow.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-pipe-dataflow.js)
|
- [parallel/test-child-process-pipe-dataflow.js](https://github.com/nodejs/node/tree/v18.12.1/test/parallel/test-child-process-pipe-dataflow.js)
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
// deno-fmt-ignore-file
|
||||||
|
// deno-lint-ignore-file
|
||||||
|
|
||||||
|
// Copyright Joyent and Node contributors. All rights reserved. MIT license.
|
||||||
|
// Taken from Node 18.12.1
|
||||||
|
// This file is automatically generated by `tests/node_compat/runner/setup.ts`. Do not modify this file manually.
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
const common = require('../common');
|
||||||
|
const assert = require('assert');
|
||||||
|
const cp = require('child_process');
|
||||||
|
const NUM_MESSAGES = 10;
|
||||||
|
const values = [];
|
||||||
|
|
||||||
|
for (let i = 0; i < NUM_MESSAGES; ++i) {
|
||||||
|
values[i] = i;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv[2] === 'child') {
|
||||||
|
const received = values.map(() => { return false; });
|
||||||
|
|
||||||
|
process.on('uncaughtException', common.mustCall((err) => {
|
||||||
|
received[err] = true;
|
||||||
|
const done = received.every((element) => { return element === true; });
|
||||||
|
|
||||||
|
if (done)
|
||||||
|
process.disconnect();
|
||||||
|
}, NUM_MESSAGES));
|
||||||
|
|
||||||
|
process.on('message', (msg) => {
|
||||||
|
// If messages are handled synchronously, throwing should break the IPC
|
||||||
|
// message processing.
|
||||||
|
throw msg;
|
||||||
|
});
|
||||||
|
|
||||||
|
process.send('ready');
|
||||||
|
} else {
|
||||||
|
const child = cp.fork(__filename, ['child']);
|
||||||
|
|
||||||
|
child.on('message', common.mustCall((msg) => {
|
||||||
|
assert.strictEqual(msg, 'ready');
|
||||||
|
values.forEach((value) => {
|
||||||
|
child.send(value);
|
||||||
|
});
|
||||||
|
}));
|
||||||
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"args": "run main.ts",
|
||||||
|
"output": "main.out"
|
||||||
|
}
|
2
tests/specs/node/next_tick_uncaught_exception/main.out
Normal file
2
tests/specs/node/next_tick_uncaught_exception/main.out
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
caught Error: thrown from next tick
|
||||||
|
at file:///[WILDCARD]/specs/node/next_tick_uncaught_exception/main.ts:4:15
|
13
tests/specs/node/next_tick_uncaught_exception/main.ts
Normal file
13
tests/specs/node/next_tick_uncaught_exception/main.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
import process from "node:process";
|
||||||
|
import { strictEqual } from "node:assert";
|
||||||
|
|
||||||
|
const error = new Error("thrown from next tick");
|
||||||
|
|
||||||
|
process.on("uncaughtException", (caught) => {
|
||||||
|
strictEqual(caught, error);
|
||||||
|
console.log("caught", caught);
|
||||||
|
});
|
||||||
|
|
||||||
|
process.nextTick(() => {
|
||||||
|
throw error;
|
||||||
|
});
|
Loading…
Reference in a new issue