[denoland/deno]未处理的承诺拒绝令人困惑

2024-07-17 940 views
6

当有未处理的承诺拒绝时,当它们被记录时,它们看起来就像未处理的抛出,但它们是不同的,应该被注意。

例如,在 REPL 中:

> Promise.reject(new Error("boo"));
Promise {
 <rejected> Error: boo
    at <unknown>:1:16
    at evaluate ($deno$/repl.ts:64:34)
    at Object.replLoop ($deno$/repl.ts:153:13)
}
error: Uncaught Error: boo
    at <unknown>:1:16
    at evaluate ($deno$/repl.ts:64:34)
    at Object.replLoop ($deno$/repl.ts:153:13)

回答

6

尝试使用旧版本,它看起来"Uncaught Error: boo"正是我们从中获得的消息v8::Exception::create_message()

目前,我们有一个自定义代码路径,如果错误是 JS 错误对象,我们会自行构造此消息并手动添加“未捕获”。即使我们为此添加了防护,V8Promise.reject(1)仍然会给出错误。Uncaught 1

我们从 V8 获得的消息对象在很多方面都很糟糕(因此首先需要其他代码路径),所以我绝对不是说我们应该接受它。

5

是否可以在 v8 repo 中创建交叉问题?

1

Chrome 生成以下内容:

Uncaught (in promise) Error: boo
    at <anonymous>:1:16
2

根据我的重写,我们只得到

Promise { <rejected> Error: boo
    at <anonymous>:2:16 }
2

@caspervonb 感谢您的检查,我认为这个问题已经解决了。

8

它还没有解决,实际上有一个新的错误,其中 repl 中的异步错误不会浮到顶部:

> const p = Promise.reject();
undefined
> ...
6

另外,为了清楚了解原始问题,我们只是想Uncaught Error: ...Uncaught (in promise) Error: ...终止时打印异步错误。

6

REPL 行为在这里保持不变,所以最好保持开放?

9

让我们在#8858 中跟踪它,因为这是关于(in promise)拒绝的指标。