Event.preventDefault 似乎不起作用(异步上下文)

mik*_*ent 8 javascript error-handling firefox unhandled-exception promise

我意识到有一些关于preventDefault不工作的问题。但我的问题是关于相当简单的情况,即您有一个async函数并且抛出错误:

throw 'error of some kind';
Run Code Online (Sandbox Code Playgroud)

...然后你想要有一个“清理”功能来捕获任何和所有此类错误。然后这将按预期工作:

window.addEventListener('unhandledrejection', function (event) {
    console.log( 'unhandled Promise rejection, event: ', event );

    // event.preventDefault();
});
Run Code Online (Sandbox Code Playgroud)

但如果我取消注释event.preventDefault(),我希望看到该throw消息不会作为错误打印到控制台。但它总是被打印出来。

我检查了一下以确保在这种情况下event确实如此cancelable。据称确实如此。

PS从我的实验看来是这样的

window.onunhandledrejection = event => {
    ...
};
Run Code Online (Sandbox Code Playgroud)

只是针对同一“unhandledrejection”事件实现同一侦听器的另一种方法。使用event.preventDefault()那里似乎也不起作用。

编辑

经过几次实验后,我似乎发现防止这种情况发生的唯一方法是try...catch在某个时刻吞掉错误(使用 ),最好是在堆栈中的最高async调用处(或者更确切地说,在函数调用序列中async),如果可以确定的话。

throw 'error of some kind';
Run Code Online (Sandbox Code Playgroud)

use*_*242 3

在 Firefox 76 上验证。Straight Promise 也不起作用。看起来像一个错误。可能应该向 Mozilla 的 Firefox 跟踪器提出问题。
注意:这不是解决方案。除了提交错误并修复它之外,是否还有其他解决方案值得怀疑。

window.onerror = msg => console.log(msg) || false

window.addEventListener('unhandledrejection', event => {
  console.log(event.cancelable, event.reason, "unhandled rejection")
  event.preventDefault()
  event.stopPropagation()
  event.stopImmediatePropagation()
  return false
})

async function x() {
  console.log('async')
  throw "async error"
}

x()

new Promise(res => {
  console.log('prom')
  throw "prom error"
})
Run Code Online (Sandbox Code Playgroud)