繁体   English   中英

Nan :: TryCatch不会拦截JS代码中Nan :: Callback中引发的异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM