这里有人知道为什么v8 API中的许多函数返回MaybeLocal
句柄而不是简单的Local
类型吗?
我知道调用可能会失败,但是Local
类型已经有一种IsEmpty()
方法,无论如何都可以很容易地查询它,并且是否已经在使用它们之前严格测试了Local
类型是否为空。是由旧API中的任何v8 API函数返回的,那么新API中的MaybeLocal
似乎是多余的。缺少坚持过时且不再受支持的v8 API版本,似乎别无选择,只能跳过使用MaybeLocal
的麻烦。
[我只是想知道它的基本原理,特别是因为正如我所说,您已经可以测试Local
来确定它是否为空,尤其是因为尝试转换为空的MaybeLocal
到Local
的位置将彻底使应用程序崩溃。
我不能说旧的API设计,但是我可以谈论一下当前的API设计。
MaybeLocal<T>
用于API取决于未决异常的状态。特别地,不变量try_catch.HasCaught() == maybe_result.IsEmpty()
应该为true。
不依赖于异常状态的API使用Local<T>
,并且可能仍返回空值。例如,UnboundScript::GetScriptName()
可能返回空的Local<String>
,但这与未决异常无关。由于没有给脚本命名,它将为空。