gpt4 book ai didi

c++ - V8 - Node C++ 插件 - 在 ConstructCall 中抛出异常导致 "FATAL ERROR: v8::ToLocalChecked Empty MaybeLocal."- 如何使构造函数失败?

转载 作者:太空狗 更新时间:2023-10-29 22:57:16 27 4
gpt4 key购买 nike

基本上我想检查传递给构造函数参数,并在参数不满足特定条件时抛出异常

我的 C++ 对象继承了 node::ObjectWrap

  v8::Persistent<v8::Function> SomeKlass::constructor;

FunctionTemplate 用于在 JavaScript 中设置构造函数

  void SomeKlass::Init(v8::Local<v8::Object> exports) {

v8::Isolate* isolate = exports->GetIsolate();

v8::Local<v8::FunctionTemplate> tpl = v8::FunctionTemplate::New(isolate, New);

/* ... */

constructor.Reset(isolate, tpl->GetFunction());

exports->Set(v8::String::NewFromUtf8(isolate, "SomeKlass"), tpl->GetFunction());

}

当 New 是构造调用时抛出异常会产生运行时 fatal error 。

但是,在“函数调用”(没有新键)中抛出相同的异常可以正常工作。

  void SomeKlass::New(const v8::FunctionCallbackInfo<v8::Value>& args) {

v8::Isolate *isolate = args.GetIsolate();

if (args.IsConstructCall()) {

SomeKlass* obj = new SomeKlass();

if (...) {
// set args.This() to undefined.

/* THIS CAUSES "FATAL ERROR: v8::ToLocalChecked Empty MaybeLocal."
*
* isolate->ThrowException(v8::Exception::TypeError(
* v8::String::NewFromUtf8(isolate, "Error")));
*/

return;
}

obj->Wrap(args.This());

args.GetReturnValue().Set(args.This());

} else {

/* Exceptions do not produce a FATAL ERROR here. */

}

}

}

使构造函数失败的正确方法是什么?

Node 版本:6.10.3 或 8.1.4

v8 版本:5.1.281 或 5.8.282

最佳答案

我发现了为什么在构造函数中抛出异常会导致崩溃。

这是因为我在另一个地方调用了 NewObject

template <typename T>//;
static v8::Local<v8::Object> NewObject(const T &args) {
auto isolate = args.GetIsolate();

auto context = isolate->GetCurrentContext();
auto cons = v8::Local<v8::Function>::New(isolate, Klass::constructor);
return cons->NewInstance(context).ToLocalChecked();
}

失败的构造函数生成一个空对象。

从中调用 ToLocalChecked() 会导致“ fatal error :v8::ToLocalChecked Empty MaybeLocal。”,这是意料之中的,也是有道理的。

关于c++ - V8 - Node C++ 插件 - 在 ConstructCall 中抛出异常导致 "FATAL ERROR: v8::ToLocalChecked Empty MaybeLocal."- 如何使构造函数失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45132180/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com