从异步 N-API 插件的 `napi_async_complete_callback` 调用时,`napi_throw_error` 做了什么?

What does `napi_throw_error` do when called from an asynchronous N-API addon's `napi_async_complete_callback`?

我最近完成了一个纯 C API 中所有函数的异步版本,用 N-API 包装以作为 nodejs 插件与 JS/TS 一起工作。

我必须解决的最后一个问题是确保 C POSIX-style 错误(即 returned 整数代码)在 worker 执行结束时正确传输到 JS (与相应的字符串,我们有异常枚举和错误消息列表)。

当用 napi_throw_error 抛出时(就像我对所有调用的同步版本所做的那样),在 napi_async_complete_callback 中,这些异常从未在 JS 级别被捕获(我想这是因为它在不同的异步上下文中;我看到网上的人对 ajax 也有类似的问题。相反,我选择将我的错误构造为 napi_value 类型,并且 return 这些 via napi_reject_deferred。这似乎达到了预期的效果,在执行 try { await My_NapiWrapper_XYZ() } catch (ex) { ... }.

时被正确捕获

所以我真的没有要解决的问题,但我很感兴趣。这些 napi_throw_error 抛出的错误可能确实 某个地方 。虽然我不知道在哪里。人们应该在哪里寻找从 napi_async_complete_callback 中捕获 napi_throw_error 抛出的错误?你能给出一个代码示例吗?

不,他们哪儿也不去。这是我刚刚与他们一起打开的错误:

https://github.com/nodejs/node/issues/41377

处理异步回调中的异常存在一个普遍问题。通常情况下,它们无法被捕获并会导致程序终止,但 Node 的开发人员已决定尽可能保留它 运行。