我正在尝试将一个工作电子应用程序从5升级到6,它引入了一个突破性的变化……
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命令。
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 hereErroring lines are e.g. 113/114 in this file if more context would help
我已经找到了可能很接近的some suggestions, e.g.,但是C++对我来说完全陌生,我已经花了太多的时间来尝试这一点。我希望修复对于了解C++的人来说是非常容易的,这将是非常感谢的!
发布于 2021-06-19 09:15:46
明白了。在每个后缀上加上.ToLocalChecked()
例如Local<Array> A = Local<Array>::Cast(group->Get(String::NewFromUtf8(isolate,"A").ToLocalChecked()));
发布于 2021-06-19 16:47:51
(这里是V8 developer。)
背景是MaybeLocal**s是由可能失败的函数**返回的,特别是:可能抛出异常的函数。这包括几乎所有涉及JavaScript执行的内容,包括设置或读取JS对象的属性(getters、setters、Proxies、只读属性/对象都可以抛出),大多数转换(涉及.valueOf或.toString的任何转换,也包括BigInt到数字或符号到字符串的转换,反之亦然,等等)。
MaybeLocal背后的思想是使这一点变得明确,因此作为V8的嵌入者,您可以确保您的代码对于此类JavaScript骗局是健壮的。通常,您应该检查是否存在MaybeLocal IsEmpty(),如果是,则处理该错误情况。为了方便起见,这里有到Local的条件转换
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。
https://stackoverflow.com/questions/68042682
复制相似问题