2

假设我有一个 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++调用时,我在从 C++拦截这个 JS 异常时遇到问题:Nan::CallbackCall()

Nan::TryCatch tc; Local<Value> retv = pf->Call( Nan::GetCurrentContext()->Global(), objc-1, &args ); if ( tc.HasCaught() ) { printf("EXCEPTION:\n"); ...

事实上,脚本只是在 JS 错误时退出,我再也没有回来检查tc,调用返回值 ( retv) 来处理任何未决的异常。我究竟做错了什么?

4

1 回答 1

3

找到了,这很可能是一个已知的 Nan bug。引用汉宝7月27日的评论:

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

基于这个提示,我解决了问题Nan::Callback:我用with替换了函数句柄v8::Persistent<Function>,终于TryCatch按预期工作了。唯一的问题:不使用 Nan 意味着代码容易中断,因为随着时间的推移,v8 并不是一个完全稳定的 API :)

于 2015-11-30T13:17:56.347 回答