mirror of
https://github.com/denoland/deno.git
synced 2024-11-21 20:38:55 +00: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
@ -62,6 +62,8 @@ export function processTicksAndRejections() {
|
||||
callback(...args);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
reportError(e);
|
||||
} finally {
|
||||
// FIXME(bartlomieju): Deno currently doesn't support async hooks
|
||||
// if (destroyHooksExist())
|
||||
|
@ -212,3 +212,7 @@ itest!(unhandled_rejection_web_process {
|
||||
envs: env_vars_for_npm_tests(),
|
||||
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
|
||||
"test-child-process-fork-ref.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-spawnsync-env.js",
|
||||
"test-child-process-stdio-inherit.js",
|
||||
@ -240,6 +237,7 @@
|
||||
"test-child-process-execfilesync-maxbuf.js",
|
||||
"test-child-process-execsync-maxbuf.js",
|
||||
"test-child-process-flush-stdio.js",
|
||||
"test-child-process-ipc-next-tick.js",
|
||||
"test-child-process-kill.js",
|
||||
"test-child-process-set-blocking.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-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-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-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)
|
||||
|
@ -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 New Issue
Block a user