首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将“v8::MaybeLocal<v8::String>”转换为“v8::Local<v8::Value>”

无法将“v8::MaybeLocal<v8::String>”转换为“v8::Local<v8::Value>”
EN

Stack Overflow用户
提问于 2021-06-19 08:36:56
回答 2查看 514关注 0票数 0

我正在尝试将一个工作电子应用程序从5升级到6,它引入了一个突破性的变化……

代码语言:javascript
复制
error C2664: 'v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>,uint32_t)': cannot convert argument 1 from 'v8::MaybeLocal<v8::String>' to 'v8::Local<v8::Value>'

对以下代码执行...compiling命令。

代码语言:javascript
复制
  Isolate* isolate = info.GetIsolate();

  Local<Object> group = Local<Object>::Cast(info[0]);
  Local<Array> A = Local<Array>::Cast(group->Get(String::NewFromUtf8(isolate,"A"))); <<-- Error here
  Local<Array> B = Local<Array>::Cast(group->Get(String::NewFromUtf8(isolate,"B"))); << Same error here

Erroring lines are e.g. 113/114 in this file if more context would help

我已经找到了可能很接近的some suggestions, e.g.,但是C++对我来说完全陌生,我已经花了太多的时间来尝试这一点。我希望修复对于了解C++的人来说是非常容易的,这将是非常感谢的!

EN

回答 2

Stack Overflow用户

发布于 2021-06-19 09:15:46

明白了。在每个后缀上加上.ToLocalChecked()

例如Local<Array> A = Local<Array>::Cast(group->Get(String::NewFromUtf8(isolate,"A").ToLocalChecked()));

票数 1
EN

Stack Overflow用户

发布于 2021-06-19 16:47:51

(这里是V8 developer。)

背景是MaybeLocal**s是由可能失败的函数**返回的,特别是:可能抛出异常的函数。这包括几乎所有涉及JavaScript执行的内容,包括设置或读取JS对象的属性(getters、setters、Proxies、只读属性/对象都可以抛出),大多数转换(涉及.valueOf.toString的任何转换,也包括BigInt到数字或符号到字符串的转换,反之亦然,等等)。

MaybeLocal背后的思想是使这一点变得明确,因此作为V8的嵌入者,您可以确保您的代码对于此类JavaScript骗局是健壮的。通常,您应该检查是否存在MaybeLocal IsEmpty(),如果是,则处理该错误情况。为了方便起见,这里有到Local的条件转换

代码语言:javascript
复制
Local<Value> value;
MaybeLocal<Value> maybe_value = FunctionThatCanThrowAnException();
if (!maybe_value.ToLocal(&value)) {
  // No value was returned. If you have a `v8::TryCatch`, it should have
  // caught an exception. Handle that somehow, and return early.
}
// Otherwise: everything's good, continue with `value`.

如果您只是简单地使用.ToLocalChecked(),您就会说:假设这个MaybeLocal实际上是一个Local,否则就会崩溃。这可能是合适的(当您可以保证某个特定的操作不可能抛出异常时),但是如果您只是到处使用它们,当发生意外的抛出时,您很可能会看到崩溃。

分配一个新的短字符串(比如"A" )是很好的(唯一可能失败的原因是OOM,在这种情况下,整个过程无论如何都会被终止);但是,一旦您的输入字符串是用户控制的(因此可以是任意大的),分配尝试就可能抛出RangeError

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68042682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档