背景:我必须更新旧的V8嵌入式代码(到5.8版)。较新的版本引入了类型MaybeLocal<>
以确保您处理空的Local<>
句柄。
为了处理空句柄,我写了一个简短的转换方法,如果句柄为空则抛出异常:
template<typename C>
inline v8::Local<C>
toLocalHandle(const v8::MaybeLocal<C> &handle)
{
if (handle.IsEmpty())
throw JSBaseClass::TerminateEx();
return handle.ToLocalChecked();
}
现在我必须在任何访问器和函数回调中捕获该异常。我已经创建了宏来为回调函数创建包装器:
#define CREATE_V8_FUNCTION_CALLBACK_WRAPPER(fktName) \
static void wrap_##fktName( \
const v8::FunctionCallbackInfo<v8::Value> &info) \
{ \
try { \
fktName(info); \
} \
catch (JSBaseClass::TerminateEx &ex) \
{ \
return; \
} \
}; \
#define V8_FUNCTION_WRAPPER(fktName) wrap_ ## fktName
现在我用它来为我的函数回调声明包装器:
static void
myFunc(const v8::FunctionCallbackInfo<v8::Value> &info);
CREATE_V8_FUNCTION_CALLBACK_WRAPPER(myFunc)
并使用另一个宏将回调包装器绑定到模板:
Local<ObjectTemplate> tmpl = ...
...
tmpl->Set(utf8_to_string("myFkt"),
FunctionTemplate::New(isolate, V8_FUNCTION_WRAPPER(myFkt)));
现在我的问题:在C ++&lt; = 2014中没有宏的情况下有一个很好的方法吗?