【问题标题】:Nan::TryCatch will not intercept exception thrown in Nan::Callback from JS codeNan::TryCatch 不会拦截 JS 代码中 Nan::Callback 抛出的异常
【发布时间】:2015-11-29 21:32:04
【问题描述】:

假设我有一个 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) 是否有任何未决异常。我做错了什么?

【问题讨论】:

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


    【解决方案1】:

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

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

    根据这个提示,我得到了问题解决:我将Nan::Callback 中的函数句柄替换为v8::Persistent&lt;Function&gt;,最后让TryCatch 按预期工作。唯一的问题:不使用 Nan 意味着代码容易中断,因为随着时间的推移,v8 并不是一个完全稳定的 API :)

    【讨论】:

    猜你喜欢
    • 2011-11-09
    • 2012-07-05
    • 1970-01-01
    • 2017-12-03
    • 1970-01-01
    • 2022-08-04
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多