[英]Nan::TryCatch will not intercept exception thrown in Nan::Callback from JS code
可以说我有一个JS函数,它只是抛出一个错误:
function() { throw "Danger, Will Robinson!"; }
此函数作为参数传递给node.js插件,并用于构造Nan :: Callback(应注意使该句柄持久化):
// get handle to JS function and its Tcl name Handle<Function> fun = Handle<Function>::Cast( info[0] ); Nan::Callback *pf = new Nan::Callback(fun);
当用C ++的Call()
Nan::Callback
时,我在从C ++ 拦截此JS异常时遇到问题:
Nan::TryCatch tc; Local<Value> retv = pf->Call( Nan::GetCurrentContext()->Global(), objc-1, &args ); if ( tc.HasCaught() ) { printf("EXCEPTION:\\n"); ...
实际上,脚本只是在JS错误时退出,而我再也没有回过头来检查tc
,并且调用返回值( retv
)是否有任何未决异常。 我究竟做错了什么?
发现它,这很可能是已知的Nan bug 。 7月27日引用hankbao的评论:
我刚遇到一个相关的问题。 我们目前正在使用电子包装我们的网络应用程序。 有一个本机节点插件,可为电子应用程序提供一些功能。 我们的网络应用程序将调用插件,并向其传递js回调。 本机插件将回调存储在NanCallback中。 它将在调用回调之前设置TryCatch。 但是,TryCatch始终无法捕获js回调引发的异常 。 事实证明,如果我使用Function :: Call而不是NanCallback :: Call()调用回调,则可以捕获异常
基于这个提示,我解决了问题 :我用v8::Persistent<Function>
替换了Nan::Callback
的函数句柄,并最终使TryCatch
正常工作。 唯一要注意的是:不使用Nan意味着代码很容易中断,因为随着时间的推移v8并不是完全稳定的API :)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.