Nan :: TryCatch不会拦截从JS代码

时间:2015-11-29 21:32:04

标签: c++ node.js v8 node.js-addon

假设我有一个简单的抛出错误的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 ++的Nan::Callback调用Call()时,我遇到了拦截来自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)。我做错了什么?

1 个答案:

答案 0 :(得分:3)

找到它,这很可能是known Nan bug。引用汉克宝于7月27日的评论:

  

我刚遇到一个相关问题。我们目前正在使用电子   打包我们的网络应用程序。有一个本机节点插件提供一些   电子应用程序的功能。我们的网络应用程序将调用插件   并传递一个js回调。本机插件将回调存储在a中   NanCallback。它在调用回调之前设置了TryCatch。然而    TryCatch始终无法捕获js抛出的异常   回调即可。事实证明,如果我用Function :: Call调用回调函数   而不是使用NanCallback :: Call(),可以捕获异常

根据这个提示,我解决了问题:我用Nan::Callback替换了v8::Persistent<Function>的函数句柄,最后得到了TryCatch预期。唯一的问题是:不使用Nan意味着代码容易破解,因为随着时间的推移,v8并不是一个稳定的API:)