如何使用napi_get_last_error_info接口获取最后一次发生的错误信息?

阅读 769
avatarAI BotBETA
要使用 `napi_get_last_error_info` 接口获取最后一次发生的错误信息,你需要按照以下步骤操作:

1. **包含必要的头文件**:确保你已经包含了 Node.js 的原生插件开发所需的头文件,通常是 `node_api.h`。

2. **调用发生错误的 N-API 函数**:在执行 N-API 函数时,如果发生错误,N-API 会设置内部的最后错误信息。

3. **调用 `napi_get_last_error_info`**:在错误发生后,立即调用 `napi_get_last_error_info` 来获取错误信息。

以下是一个示例代码片段,展示了如何使用 `napi_get_last_error_info`:

include <node_api.h>

include <stdio.h>

napi_value SomeFunction(napi_env env, napi_callback_info info) {

napi_status status;
napi_value result;
const napi_extended_error_info *error_info;

// 假设这里有一个可能失败的 N-API 调用
status = napi_get_undefined(env, &result); // 示例调用,通常不会失败
if (status != napi_ok) {
    // 获取最后一次错误信息
    status = napi_get_last_error_info(env, &error_info);
    if (status == napi_ok && error_info != NULL) {
        printf("Error Message: %s\n", error_info->error_message);
        printf("Error Code: %d\n", error_info->error_code);
        printf("Engine Error Code: %s\n", error_info->engine_error_code);
        printf("Reserved: %p\n", error_info->reserved);
    } else {
        printf("Failed to get last error info.\n");
    }
    return NULL; // 或者返回一个表示错误的 napi_value
}

// 正常处理逻辑
return result;

}

NAPI_MODULE_INIT() {

napi_value fn;
napi_status status = napi_create_function(env, NULL, 0, SomeFunction, NULL, &fn);
if (status != napi_ok) {
    napi_throw_error(env, NULL, "Failed to create function");
    return NULL;
}
status = napi_set_named_property(env, exports, "someFunction", fn);
if (status != napi_ok) {
    napi_throw_error(env, NULL, "Failed to set exports property");
    return NULL;
}
return exports;

}


在这个示例中,如果 `napi_get_undefined` 调用失败(虽然这个调用通常不会失败,仅作为示例),`napi_get_last_error_info` 会被用来获取并打印最后一次错误信息。

注意:
- `napi_get_last_error_info` 只能在发生错误后立即调用,因为每次新的 N-API 调用都可能覆盖之前的错误信息。
- 错误信息结构体 `napi_extended_error_info` 包含错误消息、错误代码、引擎错误代码和一个保留字段,可以用来详细诊断问题。
1 个回答

在C++代码中,先获取输入参数(如示例中以字符串作为参数传入),然后通过不恰当的接口调用(如napi_get_value_int32传入字符串参数)主动制造错误,此时接口返回值不为napi_ok。接着调用napi_get_last_error_info接口获取最后一次错误信息,取出错误码与制造错误的接口返回值比较,再取出错误消息创建为napi_value类型返回。示例代码如下:

#include "napi/native_api.h"
#include <assert.h>

static napi_value GetLastErrorInfo(napi_env env, napi_callback_info info) {
    size_t argc = 1;
    napi_value args[1] = {nullptr};
    napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
    int32_t value = 0;
    napi_status status = napi_get_value_int32(env, args[0], &value);
    assert(status!= napi_ok);
    const napi_extended_error_info *errorInfo;
    napi_get_last_error_info(env, &errorInfo);
    assert(errorInfo->error_code == status);
    napi_value result = nullptr;
    napi_create_string_utf8(env, errorInfo->error_message, NAPI_AUTO_LENGTH, &result);
    return result;
}

ArkTS侧调用该接口并通过日志输出获取到的错误信息(如hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_last_error_info: %{public}s', testNapi.getLastErrorInfo('message'));),若出现错误则在catch块中捕获并输出错误。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进