假设我有一个简单的抛出错误的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
)。我做错了什么?
答案 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:)