使用JSVM-API接口进行错误处理开发
====================

#### 简介

使用JSVM-API接口进行错误处理，可以更好地管理和响应错误情况。合理使用这些函数，可以提高模块的稳定性和可靠性。

#### 基本概念

在JavaScript编程中，异常和错误是常见的概念。异常表示发生了某种意外情况，而错误则指示程序无法正确执行某些操作。JSVM-API提供了一系列方法来帮助开发者在模块中处理JavaScript中的异常和错误。下面是一些基本概念：

*   **异常（Exception）**：在程序执行过程中可能会出现的意外情况，可以是语法错误、运行时错误或逻辑错误，例如除以零或对未定义变量的操作。
*   **错误（Error）**：表示程序无法顺利执行某些操作，可以是由底层系统、API函数或开发者自定义的。
*   **类型错误（TypeError）**：表示操作或值的类型不符合预期的情况，通常是由于错误的数据类型导致的。
*   **范围错误（RangeError）**：表示一个值不在预期的范围内，例如对数组长度之外的索引进行访问。
*   **语法错误（SyntaxError）**：表示一段代码的语法错误。

这些基本概念在异常和错误处理中非常重要，开发者需要通过适当的方法来捕获、处理或向用户报告这些异常和错误，以确保程序的稳定性和正确性。JSVM-API提供的方法可以帮助开发者在模块开发中处理JavaScript中的异常和错误。

#### 接口说明

| 接口 | 功能说明 |
| :-- | :-- |
| OH\_JSVM\_CreateError、OH\_JSVM\_CreateTypeError、OH\_JSVM\_CreateRangeError、OH\_JSVM\_CreateSyntaxError | 在C/C++中需要创建一个错误对象时，可以使用这些函数。 |
| OH\_JSVM\_Throw | 当在C/C++中出现了错误或异常情况时，通过使用OH\_JSVM\_CreateError或OH\_JSVM\_GetLastErrorInfo方法创建或获取JavaScript Error对象，使用该方法抛出已有的JavaScript Error对象。 |
| OH\_JSVM\_ThrowError、OH\_JSVM\_ThrowTypeError、OH\_JSVM\_ThrowRangeError、OH\_JSVM\_ThrowSyntaxError | 当在C/C++中出现了错误或异常情况时，可以使用这些函数来抛出JavaScript中的异常。 |
| OH\_JSVM\_IsError | 查询JSVM\_Value以检查它是否表示错误对象。 |
| OH\_JSVM\_GetAndClearLastException | 清理并返回最后一个JS异常。 |
| OH\_JSVM\_IsExceptionPending | 判断当前是否有异常。 |
| OH\_JSVM\_GetLastErrorInfo | 获取最后一次发生的错误信息。 |

#### 使用示例

JSVM-API接口开发流程可参考[使用JSVM-API实现JS与C/C++语言交互开发流程](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/use-jsvm-process)，本文仅展示接口对应的C++相关代码。

#### \[h2\]OH\_JSVM\_Throw

用于抛出JavaScript Error对象。当在本机代码中发生错误或检测到不符合预期的情况时，可以使用此接口来抛出JavaScript Error，使其能够被捕获并处理。示例参考OH\_JSVM\_CreateError。

#### \[h2\]OH\_JSVM\_CreateError

创建并获取一个带文本信息的JavaScript Error。

cpp部分代码：

// hello.cpp
// 捕获清除并打印错误，该函数作为公共函数，在本文档后续样例中不再声明和定义
static void GetLastErrorAndClean(JSVM\_Env env) {
    // 调用OH\_JSVM\_GetAndClearLastException接口获取并清除最后一个未处理的异常。即使存在挂起的JavaScript异常，也可以调用此API
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_GetAndClearLastException(env, &result);
    // 打印错误信息
    JSVM\_Value message = nullptr;
    JSVM\_Value errorCode = nullptr;
    OH\_JSVM\_GetNamedProperty((env), result, "message", &message);
    OH\_JSVM\_GetNamedProperty((env), result, "code", &errorCode);
    char messageStr\[256\];
    char codeStr\[256\];
    OH\_JSVM\_GetValueStringUtf8(env, message, messageStr, 256, nullptr);
    OH\_JSVM\_GetValueStringUtf8(env, errorCode, codeStr, 256, nullptr);
    OH\_LOG\_INFO(LOG\_APP, "JSVM error message: %{public}s, error code: %{public}s", messageStr, codeStr);
}

// OH\_JSVM\_CreateError的样例方法
static JSVM\_Value JsVmCreateThrowError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 在JSVM环境中创建一个字符串，并将其存储在errorCode变量中
    JSVM\_Value errorCode = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "-1", JSVM\_AUTO\_LENGTH, &errorCode);
    // 在JSVM环境中创建一个字符串，并将其存储在errorMessage变量中
    JSVM\_Value errorMessage = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "HasError", JSVM\_AUTO\_LENGTH, &errorMessage);
    // 创建一个JavaScript对象error
    JSVM\_Value error = nullptr;
    OH\_JSVM\_CreateError(env, errorCode, errorMessage, &error);
    // 通过OH\_JSVM\_Throw接口将对象抛出
    OH\_JSVM\_Throw(env, error);
    GetLastErrorAndClean(env);
    return nullptr;
}

// JsVmThrow注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmCreateThrowError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmCreateThrowError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmCreateThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmCreateThrowError();)JS";

预期输出结果

JSVM error message: HasError, error code: -1

#### \[h2\]OH\_JSVM\_ThrowError

用于抛出一个带文本信息的JS Error。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_ThrowError的样例方法
static JSVM\_Value JsVmThrowError(JSVM\_Env env, JSVM\_CallbackInfo info)
{
    size\_t argc = 1;
    JSVM\_Value argv\[1\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
    if (argc == 0) {
        // 如果没有传递参数，直接抛出错误
        OH\_JSVM\_ThrowError(env, "-1", "has Error");
    } else if (argc == 1) {
        size\_t length = 0;
        // 通过入参获取到JavaScript侧传入的字符串长度。
        OH\_JSVM\_GetValueStringUtf8(env, argv\[0\], nullptr, 0, &length);
        char \*buffer = new char\[length + 1\];
        // 获取入参的字符串内容。
        OH\_JSVM\_GetValueStringUtf8(env, argv\[0\], buffer, length + 1, nullptr);
        // 作为error信息填入到OH\_JSVM\_ThrowError接口中。
        OH\_JSVM\_ThrowError(env, "self defined error code", buffer);
        delete\[\] buffer;
    }
    GetLastErrorAndClean(env);
    return nullptr;
}
// JsVmThrowError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmThrowError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmThrowError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmThrowError();jsVmThrowError("self defined error message");)JS";

预期输出结果：

JSVM error message: has Error, error code: -1
JSVM error message: self defined error message, error code: self defined error code

#### \[h2\]OH\_JSVM\_ThrowTypeError

创建并获取一个带文本信息的JavaScript TypeError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_ThrowTypeError的样例方法
static JSVM\_Value JsVmThrowTypeError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value argv\[1\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
    if (argc == 0) {
        // 如果没有传递参数，直接抛出错误
        OH\_JSVM\_ThrowTypeError(env, "-1", "throwing type error");
    } else if (argc == 1) {
        size\_t length = 0;
        // 通过入参获取到javaScript侧传入的字符串长度
        OH\_JSVM\_GetValueStringUtf8(env, argv\[0\], nullptr, 0, &length);
        char \*buffer = new char\[length + 1\];
        // 获取入参的字符串内容
        OH\_JSVM\_GetValueStringUtf8(env, argv\[0\], buffer, length + 1, nullptr);
        // 作为error信息填入到OH\_JSVM\_ThrowTypeError接口中
        OH\_JSVM\_ThrowTypeError(env, "self defined error code", buffer);
        delete\[\] buffer;
    }
    GetLastErrorAndClean(env);
    return nullptr;
}
// JsVmThrowTypeError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmThrowTypeError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmThrowTypeError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmThrowTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmThrowTypeError();jsVmThrowTypeError("self defined error message");)JS";

预期输出结果：

JSVM error message: throwing type error, error code: -1
JSVM error message: self defined error message, error code: self defined error code

#### \[h2\]OH\_JSVM\_ThrowRangeError

创建并获取一个带文本信息的JavaScript RangeError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_ThrowRangeError的样例方法
static JSVM\_Value JsVmThrowRangeError(JSVM\_Env env, JSVM\_CallbackInfo info)
{
    // js侧传入两个参数
    size\_t argc = 2;
    JSVM\_Value argv\[2\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
    // 如果传入参数个数不为2
    if (argc != 2) {
        // 这里抛出一个RangeError
        OH\_JSVM\_ThrowRangeError(env, "OH\_JSVM\_ThrowRangeError", "Expected two numbers as arguments");
        GetLastErrorAndClean(env);
        return nullptr;
    }
    JSVM\_Value result = nullptr;
    OH\_JSVM\_GetBoolean(env, true, &result);
    return result;
}
// JsVmThrowRangeError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmThrowRangeError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmThrowRangeError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmThrowRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmThrowRangeError(1);)JS";

预期输出结果：

JSVM error message: Expected two numbers as arguments, error code: OH\_JSVM\_ThrowRangeError

#### \[h2\]OH\_JSVM\_ThrowSyntaxError

创建并获取一个带文本信息的JavaScript SyntaxError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_ThrowSyntaxError的样例方法
static JSVM\_Value JsVmThrowSyntaxError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // JS侧传入运行的JS代码
    size\_t argc = 1;
    JSVM\_Value argv\[1\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
    JSVM\_Script script = nullptr;
    // 通过OH\_JSVM\_CompileScript接口编译JS代码
    OH\_JSVM\_CompileScript(env, argv\[0\], nullptr, 0, true, nullptr, &script);
    JSVM\_Value scriptResult = nullptr;
    // 通过OH\_JSVM\_RunScript接口运行JS代码
    JSVM\_Status status = OH\_JSVM\_RunScript(env, script, &scriptResult);
    if (status != JSVM\_OK) {
        // 如果JSVM\_RunScript接口返回状态不为JSVM\_OK，则抛出一个SyntaxError
        OH\_JSVM\_ThrowSyntaxError(env, "JsVmThrowSyntaxError", "throw syntax error");
        GetLastErrorAndClean(env);
        return nullptr;
    }
    JSVM\_Value result = nullptr;
    OH\_JSVM\_GetBoolean(env, true, &result);
    return result;
}
// JsVmThrowSyntaxError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmThrowSyntaxError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmThrowSyntaxError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmThrowSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmThrowSyntaxError();)JS";

预期输出结果：

JSVM error message: throw syntax error, error code: JsVmThrowSyntaxError

#### \[h2\]OH\_JSVM\_IsError

用于判断给定的JSVM\_Value是否表示一个Error对象。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_IsError的样例方法
static JSVM\_Value JsVmIsError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
    // 调用接口OH\_JSVM\_IsError判断入参是否为一个error对象
    bool result = false;
    // 如果JSVM\_Value为一个error对象，则设置result为true的布尔值，否则设置为false
    JSVM\_Status status = OH\_JSVM\_IsError(env, args\[0\], &result);
    if (status == JSVM\_OK) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API call OH\_JSVM\_IsError success, result is %{public}d", result);
    }else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API call OH\_JSVM\_IsError failed");
    }
    // 取出result通过OH\_JSVM\_GetBoolean接口将取出的bool值转换为JSVM\_Value类型的值返回出去
    JSVM\_Value returnValue = nullptr;
    OH\_JSVM\_GetBoolean(env, result, &returnValue);
    return returnValue;
}
// JsVmIsError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmIsError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmIsError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmIsError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmIsError(Error()))JS";

预期输出结果：

JSVM API call OH\_JSVM\_IsError success, result is 1

#### \[h2\]OH\_JSVM\_CreateTypeError

创建并获取一个带文本信息的JavaScript TypeError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_CreateTypeError的样例方法
static JSVM\_Value JsVmCreateTypeError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 在JSVM环境中创建一个字符串，并将其存储在errorCode变量中
    JSVM\_Value errorCode = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "-1", JSVM\_AUTO\_LENGTH, &errorCode);
    // 在JSVM环境中创建一个字符串，并将其存储在errorMessage变量中
    JSVM\_Value errorMessage = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "HasError", JSVM\_AUTO\_LENGTH, &errorMessage);
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_CreateTypeError(env, errorCode, errorMessage, &result);
    if (status == JSVM\_OK) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API Create TypeError SUCCESS");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API Create TypeError FAILED");
    }
    return result;
}
// JsVmCreateTypeError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmCreateTypeError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmCreateTypeError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmCreateTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmCreateTypeError();)JS";

预期输出结果：

JSVM API Create TypeError SUCCESS

#### \[h2\]OH\_JSVM\_CreateRangeError

创建并获取一个带文本信息的JavaScript RangeError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_CreateRangeError的样例方法
static JSVM\_Value JsVmCreateRangeError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 在JSVM环境中创建一个字符串，并将其存储在errorCode变量中
    JSVM\_Value errorCode = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "-1", JSVM\_AUTO\_LENGTH, &errorCode);
    // 在JSVM环境中创建一个字符串，并将其存储在errorMessage变量中
    JSVM\_Value errorMessage = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "HasError", JSVM\_AUTO\_LENGTH, &errorMessage);
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_CreateRangeError(env, errorCode, errorMessage, &result);
    if (status == JSVM\_OK) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API CreateRangeError SUCCESS");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API CreateRangeError FAILED");
    }
    return result;
}
// JsVmCreateRangeError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmCreateRangeError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmCreateRangeError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmCreateRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmCreateRangeError();)JS";

预期输出结果：

JSVM API CreateRangeError SUCCESS

#### \[h2\]OH\_JSVM\_CreateSyntaxError

用于创建并获取一个带文本信息的JavaScript SyntaxError。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_CreateSyntaxError的样例方法
static JSVM\_Value JsVmCreateSyntaxError(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 在JSVM环境中创建一个字符串，并将其存储在errorCode变量中
    JSVM\_Value errorCode = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "-1", JSVM\_AUTO\_LENGTH, &errorCode);
    // 在JSVM环境中创建一个字符串，并将其存储在errorMessage变量中
    JSVM\_Value errorMessage = nullptr;
    OH\_JSVM\_CreateStringUtf8(env, "HasError", JSVM\_AUTO\_LENGTH, &errorMessage);
    JSVM\_Value result = nullptr;
    JSVM\_Status status =  OH\_JSVM\_CreateSyntaxError(env, errorCode, errorMessage, &result);
    if (status == JSVM\_OK) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API CreateSyntaxError SUCCESS");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API CreateSyntaxError FAILED");
    }
    return result;
}
// JsVmCreateSyntaxError注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmCreateSyntaxError},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmCreateSyntaxError方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmCreateSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmCreateSyntaxError();)JS";

预期输出结果：

JSVM API CreateSyntaxError SUCCESS

#### \[h2\]OH\_JSVM\_GetAndClearLastException

用于获取并清除最近一次出现的异常。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_GetAndClearLastException的样例方法
static JSVM\_Value JsVmGetAndClearLastException(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 抛出异常，创造异常情况
    OH\_JSVM\_ThrowError(env, "OH\_JSVM\_ThrowError errorCode", "OH\_JSVM\_ThrowError errorMessage");
    // 调用OH\_JSVM\_GetAndClearLastException接口获取并清除最后一个未处理的异常。即使存在挂起的JavaScript异常，也可以调用此API
    JSVM\_Value result = nullptr;
    JSVM\_Status status = OH\_JSVM\_GetAndClearLastException(env, &result);
    if (status != JSVM\_OK) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API OH\_JSVM\_GetAndClearLastException FAILED");
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API OH\_JSVM\_GetAndClearLastException SUCCESS");
    }
    return result;
}
// JsVmGetAndClearLastException注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmGetAndClearLastException},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmGetAndClearLastException方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmGetAndClearLastException", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmGetAndClearLastException();)JS";

预期输出结果：

JSVM API OH\_JSVM\_GetAndClearLastException SUCCESS

#### \[h2\]OH\_JSVM\_IsExceptionPending

用于判断是否出现了异常。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_IsExceptionPending的样例方法
static JSVM\_Value JsVmIsExceptionPending(JSVM\_Env env, JSVM\_CallbackInfo info) {
    JSVM\_Status status;
    bool isExceptionPending = false;
    // 在执行一些可能引发异常的操作后
    OH\_JSVM\_ThrowError(env, "OH\_JSVM\_ThrowError errorCode", "OH\_JSVM\_ThrowError errorMessage");
    // 检查当前环境中是否有异常挂起
    status = OH\_JSVM\_IsExceptionPending(env, &isExceptionPending);
    if (status != JSVM\_OK) {
        return nullptr;
    }
    if (isExceptionPending) {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API OH\_JSVM\_IsExceptionPending: SUCCESS");
        // 处理异常挂起的情况
        JSVM\_Value result = nullptr;
        status = OH\_JSVM\_GetAndClearLastException(env, &result);
        if (status != JSVM\_OK) {
            return nullptr;
        }
        // 将处理的异常返回出去
        return result;
    } else {
        OH\_LOG\_INFO(LOG\_APP, "JSVM API OH\_JSVM\_IsExceptionPending: FAILED");
    }
    return nullptr;
}
// JsVmIsExceptionPending注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmIsExceptionPending},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmIsExceptionPending方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmIsExceptionPending", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmIsExceptionPending();)JS";

预期输出结果：

JSVM API OH\_JSVM\_IsExceptionPending: SUCCESS

#### \[h2\]OH\_JSVM\_GetLastErrorInfo

用于获取调用JSVM接口最后一次发生的错误信息（接口返回值不为JSVM\_OK），包括错误码、错误消息以及错误堆栈信息，即使存在挂起的JavaScript异常，也可以调用此API。

注意: 通过OH\_JSVM\_ThrowError等接口主动触发的Error不会被该接口获取，除非调用接口时返回值不为JSVM\_OK。

cpp部分代码：

// hello.cpp
// OH\_JSVM\_GetLastErrorInfo的样例方法
static JSVM\_Value JsVmGetLastErrorInfo(JSVM\_Env env, JSVM\_CallbackInfo info) {
    // 获取输入参数（这里以字符串message作为参数传入）
    size\_t argc = 1;
    JSVM\_Value args\[1\] = {nullptr};
    OH\_JSVM\_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
    // 将传入的字符串参数以OH\_JSVM\_GetValueInt32取出，主动制造错误
    int32\_t value = 0;
    OH\_JSVM\_GetValueInt32(env, args\[0\], &value);
    // 调用接口OH\_JSVM\_GetLastErrorInfo获取最后一次错误信息
    const JSVM\_ExtendedErrorInfo \*errorInfo;
    OH\_JSVM\_GetLastErrorInfo(env, &errorInfo);

    // 取出错误消息作为返回值带出去打印
    JSVM\_Value result = nullptr;
    OH\_LOG\_INFO(LOG\_APP,
                "JSVM API OH\_JSVM\_GetLastErrorInfo: SUCCESS, error message is %{public}s, error code is %{public}d",
                errorInfo->errorMessage, errorInfo->errorCode);
    // 对异常进行处理，防止程序由于抛异常而退出
    JSVM\_Value result1 = nullptr;
    OH\_JSVM\_GetAndClearLastException(env, &result1);
    OH\_JSVM\_CreateInt32(env, errorInfo->errorCode, &result);
    return result;
}
// JsVmGetLastErrorInfo注册回调
static JSVM\_CallbackStruct param\[\] = {
    {.data = nullptr, .callback = JsVmGetLastErrorInfo},
};
static JSVM\_CallbackStruct \*method = param;
// JsVmGetLastErrorInfo方法别名，供JS调用
static JSVM\_PropertyDescriptor descriptor\[\] = {
    {"jsVmGetLastErrorInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM\_DEFAULT},
};
// 样例测试js
const char \*srcCallNative = R"JS(jsVmGetLastErrorInfo();)JS";

预期输出结果：

JSVM API OH\_JSVM\_GetLastErrorInfo: SUCCESS, error message is A number was expected, error code is 6