v8 中 MaybeLocal<Value> 的意义何在?

What is the point of MaybeLocal<Value> in v8?

这里有人知道为什么 v8 API return MaybeLocal 中的许多函数处理而不是简单的 Local 类型吗?

我知道调用可能会失败,但是 Local 类型已经有一个 IsEmpty() 方法,无论如何都可以轻松查询,如果已经严格测试 Local 类型在使用它们之前是空的,只要它们被旧 API 中的任何 v8 API 函数 return 编辑,那么新 API 中的 MaybeLocal 似乎是不必要的多余的。除了坚持使用过时且不再受支持的 v8 版本 API,似乎别无选择,只能跳过使用 MaybeLocal.

的障碍

我只是想知道它的基本原理是什么,特别是因为正如我所说,您已经可以测试 Local 以查看它是否为空,尤其是因为尝试将 MaybeLocal 为空 Local 将彻底崩溃应用程序。

尽管 Local<T>MaybeLocal<T> 可能看起来相似,但它们的用途却截然不同。

当 API return 是 T 或抛出错误时,使用

MaybeLocal<T>。特别是,不变量 try_catch.HasCaught() == maybe_result.IsEmpty() 应该成立。还有一个 Maybe<T> 类型用于 API,如 Object::Set,它没有 return 一个 JavaScript 值,但仍可能抛出。

Local<T> 用于其他所有内容,基本上表示可为空的 T 引用。例如,Isolate::GetCurrentContext 可能 return 是一个空的 Local<Context>,但这不是因为它抛出,而是空的,因为没有当前上下文。