From 97954003cc87b664768918173e8d00f6df35e04f Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Sun, 21 Aug 2022 19:16:42 +0100 Subject: feat: `queueMicrotask()` error handling (#15522) Adds error event dispatching for queueMicrotask(). Consequently unhandled errors are now reported with Deno.core.terminate(), which is immune to the existing quirk with plainly thrown errors (#14158). --- cli/tests/integration/run_tests.rs | 11 +++++++++++ cli/tests/testdata/queue_microtask_error.ts | 5 +++++ cli/tests/testdata/queue_microtask_error.ts.out | 6 ++++++ cli/tests/testdata/queue_microtask_error_handled.ts | 21 +++++++++++++++++++++ .../testdata/queue_microtask_error_handled.ts.out | 15 +++++++++++++++ 5 files changed, 58 insertions(+) create mode 100644 cli/tests/testdata/queue_microtask_error.ts create mode 100644 cli/tests/testdata/queue_microtask_error.ts.out create mode 100644 cli/tests/testdata/queue_microtask_error_handled.ts create mode 100644 cli/tests/testdata/queue_microtask_error_handled.ts.out (limited to 'cli/tests') diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index 9c60cc745..8998eecc9 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2745,6 +2745,17 @@ itest!(report_error_end_of_program { exit_code: 1, }); +itest!(queue_microtask_error { + args: "run --quiet queue_microtask_error.ts", + output: "queue_microtask_error.ts.out", + exit_code: 1, +}); + +itest!(queue_microtask_error_handled { + args: "run --quiet queue_microtask_error_handled.ts", + output: "queue_microtask_error_handled.ts.out", +}); + itest!(spawn_stdout_inherit { args: "run --quiet --unstable -A spawn_stdout_inherit.ts", output: "spawn_stdout_inherit.ts.out", diff --git a/cli/tests/testdata/queue_microtask_error.ts b/cli/tests/testdata/queue_microtask_error.ts new file mode 100644 index 000000000..b2e9642c5 --- /dev/null +++ b/cli/tests/testdata/queue_microtask_error.ts @@ -0,0 +1,5 @@ +queueMicrotask(() => { + throw new Error("foo"); +}); +console.log(1); +Promise.resolve().then(() => console.log(2)); diff --git a/cli/tests/testdata/queue_microtask_error.ts.out b/cli/tests/testdata/queue_microtask_error.ts.out new file mode 100644 index 000000000..6c4d41936 --- /dev/null +++ b/cli/tests/testdata/queue_microtask_error.ts.out @@ -0,0 +1,6 @@ +1 +error: Uncaught Error: foo + throw new Error("foo"); + ^ + at [WILDCARD]/queue_microtask_error.ts:2:9 + at deno:core/[WILDCARD] diff --git a/cli/tests/testdata/queue_microtask_error_handled.ts b/cli/tests/testdata/queue_microtask_error_handled.ts new file mode 100644 index 000000000..7d1440135 --- /dev/null +++ b/cli/tests/testdata/queue_microtask_error_handled.ts @@ -0,0 +1,21 @@ +addEventListener("error", (event) => { + console.log({ + cancelable: event.cancelable, + message: event.message, + filename: event.filename, + lineno: event.lineno, + colno: event.colno, + error: event.error, + }); + event.preventDefault(); +}); + +onerror = (event) => { + console.log("onerror() called", event.error); +}; + +queueMicrotask(() => { + throw new Error("foo"); +}); +console.log(1); +Promise.resolve().then(() => console.log(2)); diff --git a/cli/tests/testdata/queue_microtask_error_handled.ts.out b/cli/tests/testdata/queue_microtask_error_handled.ts.out new file mode 100644 index 000000000..7f3f7f84a --- /dev/null +++ b/cli/tests/testdata/queue_microtask_error_handled.ts.out @@ -0,0 +1,15 @@ +1 +{ + cancelable: true, + message: "Uncaught Error: foo", + filename: "[WILDCARD]/queue_microtask_error_handled.ts", + lineno: 18, + colno: 9, + error: Error: foo + at [WILDCARD]/queue_microtask_error_handled.ts:18:9 + at deno:core/[WILDCARD] +} +onerror() called Error: foo + at [WILDCARD]/queue_microtask_error_handled.ts:18:9 + at deno:core/[WILDCARD] +2 -- cgit v1.2.3