Node API 抛出它自己的错误消息而不是自己的错误消息

Man*_*kis 1 c++ node.js node.js-addon

我正在尝试为 编写以下函数NAPI

int addon::fakeAdd(int a, int b)
{
    return a + b;
}
Napi::Number addon::addWrapped(const Napi::CallbackInfo &info)
{

    Napi::Env env = info.Env();
    if (info.Length() < 2 || !info[0].IsNumber() || !info[1].IsNumber())
    {

        auto x = Napi::TypeError::New(env, "You did not provide 2 numbers");
        x.ThrowAsJavaScriptException();
    }

    Napi::Number num1 = info[0].As<Napi::Number>();
    Napi::Number num2 = info[1].As<Napi::Number>();
    int returnValue = addon::fakeAdd(num1.Int32Value(), num2.Int32Value());
    return Number::New(env, returnValue);
}
Run Code Online (Sandbox Code Playgroud)

我将此函数导出为add. 当我使用参数(例如)从 javascript 调用它时,addon.add(1,2)一切都像魅力一样工作,我得到了正确的结果,即 3。现在我想处理用户没有向我的函数提供任何参数或(一个或两个)的情况参数不是数字。在这种情况下,我想抛出一条自定义消息(“您没有提供 2 个数字”)。但是,当我尝试在没有任何参数的情况下从 JavaScript 调用我的方法时,出现以下错误:

console.log(addon.add());
                  ^

Error: A number was expected
Run Code Online (Sandbox Code Playgroud)

我收到这条特定消息而不是我在块中写的消息是否有原因if

以下是我导出函数的方法:

Napi::Object addon::Init(Napi::Env env, Napi::Object exports)
{
    exports.Set("add", Napi::Function::New(env, addon::addWrapped));
    exports.Set("getOsName", Napi::Function::New(env, addon::getOSNameWrapped));
    exports.Set("writeToFile", Napi::Function::New(env, addon::writeFileWrapped));
    return exports;
}
Run Code Online (Sandbox Code Playgroud)

这是绑定.gyp 文件

{
    "targets": [{
        "target_name": "testaddon",
        "cflags!": [ "-fno-exceptions"],
        "cflags_cc!": [ "-fno-exceptions" ],
        "cflags_cc":["-std=c++1z" ],
        "sources": [
            "cppsrc/main.cpp",
            "cppsrc/functionexample.cpp"
        ],
        'include_dirs': [
            "<!@(node -p \"require('node-addon-api').include\")"
        ],
        'libraries': [],
        'dependencies': [
            "<!(node -p \"require('node-addon-api').gyp\")"
        ],
        'defines': [ 'NAPI_DISABLE_CPP_EXCEPTIONS' ]
    }]
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*her 5

假设您在 binding.gyp 中禁用了 C++ 异常(cflags/cflags_cc=" -fno-exceptions ", 定义:" NAPI_DISABLE_CPP_EXCEPTIONS "),您应该阅读错误处理文档的这一部分

抛出 JavaScript 异常后,代码通常应 在执行任何必要的清理后立即从本机回调返回。

他们的例子:

Napi::Error::New(env, "Example exception").ThrowAsJavaScriptException();
return;
Run Code Online (Sandbox Code Playgroud)

调用 ThrowAsJavaScriptException() 不会引发 C++ 异常,因此如果您不返回,您的 C++ 函数将继续运行。