1# 使用JSVM-API接口进行错误处理开发
2
3## 简介
4
5使用JSVM-API接口进行错误处理开发,使得在JSVM-API模块中能够更好地管理和响应错误情况。通过合理使用这些函数,可以提高模块的稳定性和可靠性。
6
7## 基本概念
8
9在JavaScript编程中,异常和错误是常见的概念。异常表示发生了某种意外情况,而错误则指示程序无法正确执行某些操作。JSVM-API提供了一系列方法来帮助开发者在模块中处理JavaScript中的异常和错误。下面是一些基本概念:
10
11- **异常(Exception)**:在程序执行过程中可能会出现的意外情况,可以是语法错误、运行时错误或逻辑错误,例如除以零或对未定义变量的操作。
12- **错误(Error)**:表示程序无法顺利执行某些操作,可以是由底层系统、API函数或开发者自定义的。
13- **类型错误(TypeError)**:表示操作或值的类型不符合预期的情况,通常是由于错误的数据类型导致的。
14- **范围错误(RangeError)**:表示一个值不在预期的范围内,例如对数组长度之外的索引进行访问。
15- **语法错误(SyntaxError)**:表示一段代码的语法错误。
16
17这些基本概念在异常和错误处理中非常重要,开发者需要通过适当的方法来捕获、处理或向用户报告这些异常和错误,以确保程序的稳定性和正确性。JSVM-API提供的方法可以帮助开发者在模块开发中处理JavaScript中的异常和错误。
18
19## 接口说明
20
21| 接口                       | 功能说明                       |
22|----------------------------|--------------------------------|
23| OH_JSVM_CreateError、OH_JSVM_CreateTypeError、OH_JSVM_CreateRangeError、OH_JSVM_CreateSyntaxError | 在C/C++中需要创建一个错误对象时,可以使用这些函数。|
24| OH_JSVM_Throw | 当在C/C++中出现了错误或异常情况时,通过使用OH_JSVM_CreateError或OH_JSVM_GetLastErrorInfo方法创建或获取JavaScript Error对象,使用该方法抛出已有的JavaScript Error对象。 |
25| OH_JSVM_ThrowError、OH_JSVM_ThrowTypeError、OH_JSVM_ThrowRangeError、OH_JSVM_ThrowSyntaxError | 当在C/C++中出现了错误或异常情况时,可以使用这些函数来抛出JavaScript中的异常。 |
26| OH_JSVM_IsError              | 查询JSVM_Value以检查它是否表示错误对象。|
27| OH_JSVM_GetAndClearLastException    | 清理并返回最后一个JS异常。|
28| OH_JSVM_IsExceptionPending   | 判断当前是否有异常。|
29| OH_JSVM_GetLastErrorInfo     | 获取最后一次发生的错误信息。|
30
31## 使用示例
32
33JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++相关代码进行展示。
34
35### OH_JSVM_Throw
36
37用于抛出JavaScript Error对象。当在本机代码中发生错误或检测到不符合预期的情况时,可以使用此接口来抛出一个Javascript Error,使其能够被捕获并处理。示例参考OH_JSVM_CreateError。
38
39### OH_JSVM_CreateError
40
41创建并获取一个带文本信息的JavaScript Error。
42
43cpp部分代码
44
45```cpp
46// hello.cpp
47// 捕获清除并打印错误,该函数作为公共函数,在本文档后续样例中不再声明和定义
48static void GetLastErrorAndClean(JSVM_Env env) {
49    // 调用OH_JSVM_GetAndClearLastException接口获取并清除最后一个未处理的异常。即使存在挂起的JavaScript异常,也可以调用此API
50    JSVM_Value result = nullptr;
51    JSVM_Status status = OH_JSVM_GetAndClearLastException(env, &result);
52    // 打印错误信息
53    JSVM_Value message;
54    JSVM_Value errorCode;
55    OH_JSVM_GetNamedProperty((env), result, "message", &message);
56    OH_JSVM_GetNamedProperty((env), result, "code", &errorCode);
57    char messagestr[256];
58    char codeStr[256];
59    OH_JSVM_GetValueStringUtf8(env, message, messagestr, 256, nullptr);
60    OH_JSVM_GetValueStringUtf8(env, errorCode, codeStr, 256, nullptr);
61    OH_LOG_INFO(LOG_APP, "JSVM error message: %{public}s, error code: %{public}s", messagestr, codeStr);
62}
63
64// OH_JSVM_CreateError的样例方法
65static JSVM_Value JsVmCreateThrowError(JSVM_Env env, JSVM_CallbackInfo info) {
66    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
67    JSVM_Value errorCode = nullptr;
68    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
69    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
70    JSVM_Value errorMessage = nullptr;
71    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
72    // 创建一个JavaScript对象error
73    JSVM_Value error = nullptr;
74    OH_JSVM_CreateError(env, errorCode, errorMessage, &error);
75    // 通过OH_JSVM_Throw接口将对象抛出
76    OH_JSVM_Throw(env, error);
77    GetLastErrorAndClean(env);
78    return nullptr;
79}
80
81// JsVmThrow注册回调
82static JSVM_CallbackStruct param[] = {
83    {.data = nullptr, .callback = JsVmCreateThrowError},
84};
85static JSVM_CallbackStruct *method = param;
86// JsVmThrow方法别名,供JS调用
87static JSVM_PropertyDescriptor descriptor[] = {
88    {"jsVmCreateThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
89};
90// 样例测试js
91const char *srcCallNative = R"JS(jsVmCreateThrowError();)JS";
92```
93预期输出结果
94```ts
95JSVM error message: HasError, error code: -1
96```
97
98### OH_JSVM_ThrowError
99
100用于抛出一个带文本信息的JS Error。
101
102cpp部分代码
103
104```cpp
105// hello.cpp
106// OH_JSVM_ThrowError的样例方法
107static JSVM_Value JsVmThrowError(JSVM_Env env, JSVM_CallbackInfo info)
108{
109    size_t argc = 1;
110    JSVM_Value argv[1] = {nullptr};
111    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
112    if (argc == 0) {
113        // 如果没有传递参数,直接抛出错误
114        OH_JSVM_ThrowError(env, "-1", "has Error");
115    } else if (argc == 1) {
116        size_t length;
117        // 通过入参获取到javaScript侧传入的字符串长度。
118        OH_JSVM_GetValueStringUtf8(env, argv[0], nullptr, 0, &length);
119        char *buffer = new char[length + 1];
120        // 获取入参的字符串内容。
121        OH_JSVM_GetValueStringUtf8(env, argv[0], buffer, length + 1, nullptr);
122        // 作为error信息填入到OH_JSVM_ThrowError接口中。
123        OH_JSVM_ThrowError(env, "self defined error code", buffer);
124        delete[] buffer;
125    }
126    GetLastErrorAndClean(env);
127    return nullptr;
128}
129// JsVmThrowError注册回调
130static JSVM_CallbackStruct param[] = {
131    {.data = nullptr, .callback = JsVmThrowError},
132};
133static JSVM_CallbackStruct *method = param;
134// JsVmThrowError方法别名,供JS调用
135static JSVM_PropertyDescriptor descriptor[] = {
136    {"jsVmThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
137};
138// 样例测试js
139const char *srcCallNative = R"JS(jsVmThrowError();jsVmThrowError("self defined error message");)JS";
140```
141
142预期输出结果
143```ts
144JSVM error message: has Error, error code: -1
145JSVM error message: self defined error message, error code: self defined error code
146```
147
148### OH_JSVM_ThrowTypeError
149
150创建并获取一个带文本信息的JavaScript TypeError。
151
152cpp部分代码
153
154```cpp
155// hello.cpp
156// OH_JSVM_ThrowTypeError的样例方法
157static JSVM_Value JsVmThrowTypeError(JSVM_Env env, JSVM_CallbackInfo info) {
158    size_t argc = 1;
159    JSVM_Value argv[1] = {nullptr};
160    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
161    if (argc == 0) {
162        // 如果没有传递参数,直接抛出错误
163        OH_JSVM_ThrowTypeError(env, "-1", "throwing type error");
164    } else if (argc == 1) {
165        size_t length;
166        // 通过入参获取到javaScript侧传入的字符串长度
167        OH_JSVM_GetValueStringUtf8(env, argv[0], nullptr, 0, &length);
168        char *buffer = new char[length + 1];
169        // 获取入参的字符串内容
170        OH_JSVM_GetValueStringUtf8(env, argv[0], buffer, length + 1, nullptr);
171        // 作为error信息填入到OH_JSVM_ThrowError接口中
172        OH_JSVM_ThrowTypeError(env, "self defined error code", buffer);
173        delete[] buffer;
174    }
175    GetLastErrorAndClean(env);
176    return nullptr;
177}
178// JsVmThrowTypeError注册回调
179static JSVM_CallbackStruct param[] = {
180    {.data = nullptr, .callback = JsVmThrowTypeError},
181};
182static JSVM_CallbackStruct *method = param;
183// JsVmThrowTypeError方法别名,供JS调用
184static JSVM_PropertyDescriptor descriptor[] = {
185    {"jsVmThrowTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
186};
187// 样例测试js
188const char *srcCallNative = R"JS(jsVmThrowTypeError();jsVmThrowTypeError("self defined error message");)JS";
189```
190
191预期输出结果
192```ts
193JSVM error message: throwing type error, error code: -1
194JSVM error message: self defined error message, error code: self defined error code
195```
196
197### OH_JSVM_ThrowRangeError
198
199创建并获取一个带文本信息的JavaScript RangeError。
200
201cpp部分代码
202
203```cpp
204// hello.cpp
205// OH_JSVM_ThrowRangeError的样例方法
206static JSVM_Value JsVmThrowRangeError(JSVM_Env env, JSVM_CallbackInfo info)
207{
208    // js侧传入两个参数
209    size_t argc = 2;
210    JSVM_Value argv[2] = {nullptr};
211    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
212    // 如果传入参数个数不为2
213    if (argc != 2) {
214        // 这里抛出一个RangeError
215        OH_JSVM_ThrowRangeError(env, "OH_JSVM_ThrowRangeError", "Expected two numbers as arguments");
216        GetLastErrorAndClean(env);
217        return nullptr;
218    }
219    JSVM_Value result = nullptr;
220    OH_JSVM_GetBoolean(env, true, &result);
221    return result;
222}
223// JsVmThrowRangeError注册回调
224static JSVM_CallbackStruct param[] = {
225    {.data = nullptr, .callback = JsVmThrowRangeError},
226};
227static JSVM_CallbackStruct *method = param;
228// JsVmThrowRangeError方法别名,供JS调用
229static JSVM_PropertyDescriptor descriptor[] = {
230    {"jsVmThrowRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
231};
232// 样例测试js
233const char *srcCallNative = R"JS(jsVmThrowRangeError(1);)JS";
234```
235
236
237预期输出结果
238```ts
239JSVM error message: Expected two numbers as arguments, error code: OH_JSVM_ThrowRangeError
240```
241
242### OH_JSVM_ThrowSyntaxError
243
244创建并获取一个带文本信息的JavaScript SyntaxError。
245
246cpp部分代码
247
248```cpp
249// hello.cpp
250// OH_JSVM_ThrowSyntaxError的样例方法
251static JSVM_Value JsVmThrowSyntaxError(JSVM_Env env, JSVM_CallbackInfo info) {
252    // JS侧传入运行的JS代码
253    size_t argc = 1;
254    JSVM_Value argv[1] = {nullptr};
255    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
256    JSVM_Script script = nullptr;
257    // 通过OH_JSVM_CompileScript接口编译JS代码
258    OH_JSVM_CompileScript(env, argv[0], nullptr, 0, true, nullptr, &script);
259    JSVM_Value scriptResult = nullptr;
260    // 通过OH_JSVM_RunScript接口运行JS代码
261    JSVM_Status status = OH_JSVM_RunScript(env, script, &scriptResult);
262    if (status != JSVM_OK) {
263        // 如果JSVM_RunScript接口返回状态不为JSVM_OK,则抛出一个SyntaxError
264        OH_JSVM_ThrowSyntaxError(env, "JsVmThrowSyntaxError", "throw syntax error");
265        GetLastErrorAndClean(env);
266        return nullptr;
267    }
268    JSVM_Value result = nullptr;
269    OH_JSVM_GetBoolean(env, true, &result);
270    return result;
271}
272// JsVmThrowSyntaxError注册回调
273static JSVM_CallbackStruct param[] = {
274    {.data = nullptr, .callback = JsVmThrowSyntaxError},
275};
276static JSVM_CallbackStruct *method = param;
277// JsVmThrowSyntaxError方法别名,供JS调用
278static JSVM_PropertyDescriptor descriptor[] = {
279    {"jsVmThrowSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
280};
281// 样例测试js
282const char *srcCallNative = R"JS(jsVmThrowSyntaxError();)JS";
283```
284
285预期输出结果
286```ts
287JSVM error message: throw syntax error, error code: JsVmThrowSyntaxError
288```
289
290### OH_JSVM_IsError
291
292用于判断给定的JSVM_Value是否表示一个error对象。
293
294cpp部分代码
295
296```cpp
297// hello.cpp
298// OH_JSVM_IsError的样例方法
299static JSVM_Value JsVmIsError(JSVM_Env env, JSVM_CallbackInfo info) {
300    size_t argc = 1;
301    JSVM_Value args[1] = {nullptr};
302    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
303    // 调用接口OH_JSVM_IsError判断入参是否为一个error对象
304    bool result = false;
305    // 如果JSVM_Value为一个error对象,则设置result为true的布尔值,否则设置为false
306    JSVM_Status status = OH_JSVM_IsError(env, args[0], &result);
307    if (status == JSVM_OK) {
308        OH_LOG_INFO(LOG_APP, "JSVM API call OH_JSVM_IsError success, result is %{public}d", result);
309    }else {
310        OH_LOG_INFO(LOG_APP, "JSVM API call OH_JSVM_IsError failed");
311    }
312    // 取出result通过OH_JSVM_GetBoolean接口将取出的bool值转换为JSVM_Value类型的值返回出去
313    JSVM_Value returnValue = nullptr;
314    OH_JSVM_GetBoolean(env, result, &returnValue);
315    return returnValue;
316}
317// JsVmIsError注册回调
318static JSVM_CallbackStruct param[] = {
319    {.data = nullptr, .callback = JsVmIsError},
320};
321static JSVM_CallbackStruct *method = param;
322// JsVmIsError方法别名,供JS调用
323static JSVM_PropertyDescriptor descriptor[] = {
324    {"jsVmIsError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
325};
326// 样例测试js
327const char *srcCallNative = R"JS(jsVmIsError(Error()))JS";
328```
329
330预期输出结果
331```ts
332JSVM API call OH_JSVM_IsError success, result is 1
333```
334
335### OH_JSVM_CreateTypeError
336
337创建并获取一个带文本信息的JavaScript TypeError。
338
339cpp部分代码
340
341```cpp
342// hello.cpp
343// OH_JSVM_CreateTypeError的样例方法
344static JSVM_Value JsVmCreateTypeError(JSVM_Env env, JSVM_CallbackInfo info) {
345    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
346    JSVM_Value errorCode = nullptr;
347    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
348    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
349    JSVM_Value errorMessage = nullptr;
350    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
351    JSVM_Value result = nullptr;
352    JSVM_Status status = OH_JSVM_CreateTypeError(env, errorCode, errorMessage, &result);
353    if (status == JSVM_OK) {
354        OH_LOG_INFO(LOG_APP, "JSVM API Create TypeError SUCCESS");
355    } else {
356        OH_LOG_INFO(LOG_APP, "JSVM API Create TypeError FAILED");
357    }
358    return result;
359}
360// JsVmCreateTypeError注册回调
361static JSVM_CallbackStruct param[] = {
362    {.data = nullptr, .callback = JsVmCreateTypeError},
363};
364static JSVM_CallbackStruct *method = param;
365// JsVmCreateTypeError方法别名,供JS调用
366static JSVM_PropertyDescriptor descriptor[] = {
367    {"jsVmCreateTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
368};
369// 样例测试js
370const char *srcCallNative = R"JS(jsVmCreateTypeError();)JS";
371```
372
373预期输出结果
374```ts
375JSVM API Create TypeError SUCCESS
376```
377
378### OH_JSVM_CreateRangeError
379
380创建并获取一个带文本信息的JavaScript RangeError。
381
382cpp部分代码
383
384```cpp
385// hello.cpp
386// OH_JSVM_CreateRangeError的样例方法
387static JSVM_Value JsVmCreateRangeError(JSVM_Env env, JSVM_CallbackInfo info) {
388    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
389    JSVM_Value errorCode = nullptr;
390    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
391    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
392    JSVM_Value errorMessage = nullptr;
393    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
394    JSVM_Value result = nullptr;
395    JSVM_Status status = OH_JSVM_CreateRangeError(env, errorCode, errorMessage, &result);
396    if (status == JSVM_OK) {
397        OH_LOG_INFO(LOG_APP, "JSVM API CreateRangeError SUCCESS");
398    } else {
399        OH_LOG_INFO(LOG_APP, "JSVM API CreateRangeError FAILED");
400    }
401    return result;
402}
403// JsVmCreateRangeError注册回调
404static JSVM_CallbackStruct param[] = {
405    {.data = nullptr, .callback = JsVmCreateRangeError},
406};
407static JSVM_CallbackStruct *method = param;
408// JsVmCreateRangeError方法别名,供JS调用
409static JSVM_PropertyDescriptor descriptor[] = {
410    {"jsVmCreateRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
411};
412// 样例测试js
413const char *srcCallNative = R"JS(jsVmCreateRangeError();)JS";
414```
415
416预期输出结果
417```ts
418JSVM API CreateRangeError SUCCESS
419```
420### OH_JSVM_CreateSyntaxError
421
422用于创建并获取一个带文本信息的JavaScript SyntaxError。
423
424cpp部分代码
425
426```cpp
427// hello.cpp
428// OH_JSVM_CreateSyntaxError的样例方法
429static JSVM_Value JsVmCreateSyntaxError(JSVM_Env env, JSVM_CallbackInfo info) {
430    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
431    JSVM_Value errorCode = nullptr;
432    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
433    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
434    JSVM_Value errorMessage = nullptr;
435    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
436    JSVM_Value result = nullptr;
437    JSVM_Status status =  OH_JSVM_CreateSyntaxError(env, errorCode, errorMessage, &result);
438    if (status == JSVM_OK) {
439        OH_LOG_INFO(LOG_APP, "JSVM API CreateSyntaxError SUCCESS");
440    } else {
441        OH_LOG_INFO(LOG_APP, "JSVM API CreateSyntaxError FAILED");
442    }
443    return result;
444}
445// JsVmCreateSyntaxError注册回调
446static JSVM_CallbackStruct param[] = {
447    {.data = nullptr, .callback = JsVmCreateSyntaxError},
448};
449static JSVM_CallbackStruct *method = param;
450// JsVmThrow方法别名,供JS调用
451static JSVM_PropertyDescriptor descriptor[] = {
452    {"jsVmCreateSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
453};
454// 样例测试js
455const char *srcCallNative = R"JS(jsVmCreateSyntaxError();)JS";
456```
457
458预期输出结果
459```ts
460JSVM API CreateSyntaxError SUCCESS
461```
462
463### OH_JSVM_GetAndClearLastException
464
465用于获取并清除最近一次出现的异常。
466
467cpp部分代码
468
469```cpp
470// hello.cpp
471// OH_JSVM_GetAndClearLastException的样例方法
472static JSVM_Value JsVmGetAndClearLastException(JSVM_Env env, JSVM_CallbackInfo info) {
473    // 抛出异常,创造异常情况
474    OH_JSVM_ThrowError(env, "OH_JSVM_ThrowError errorCode", "OH_JSVM_ThrowError errorMessage");
475    // 调用OH_JSVM_GetAndClearLastException接口获取并清除最后一个未处理的异常。即使存在挂起的JavaScript异常,也可以调用此API
476    JSVM_Value result = nullptr;
477    JSVM_Status status = OH_JSVM_GetAndClearLastException(env, &result);
478    if (status != JSVM_OK) {
479        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_GetAndClearLastException FAILED");
480    } else {
481        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_GetAndClearLastException SUCCESS");
482    }
483    return result;
484}
485// JsVmGetAndClearLastException注册回调
486static JSVM_CallbackStruct param[] = {
487    {.data = nullptr, .callback = JsVmGetAndClearLastException},
488};
489static JSVM_CallbackStruct *method = param;
490// JsVmGetAndClearLastException方法别名,供JS调用
491static JSVM_PropertyDescriptor descriptor[] = {
492    {"jsVmGetAndClearLastException", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
493};
494// 样例测试js
495const char *srcCallNative = R"JS(jsVmGetAndClearLastException();)JS";
496```
497
498预期输出结果
499```ts
500JSVM API OH_JSVM_GetAndClearLastException SUCCESS
501```
502
503### OH_JSVM_IsExceptionPending
504
505用于判断是否出现了异常。
506
507cpp部分代码
508
509```cpp
510// hello.cpp
511// OH_JSVM_GetAndClearLastException的样例方法
512static JSVM_Value JsVmIsExceptionPending(JSVM_Env env, JSVM_CallbackInfo info) {
513    JSVM_Status status;
514    bool isExceptionPending = false;
515    // 在执行一些可能引发异常的操作后
516    OH_JSVM_ThrowError(env, "OH_JSVM_ThrowError errorCode", "OH_JSVM_ThrowError errorMessage");
517    // 检查当前环境中是否有异常挂起
518    status = OH_JSVM_IsExceptionPending(env, &isExceptionPending);
519    if (status != JSVM_OK) {
520        return nullptr;
521    }
522    if (isExceptionPending) {
523        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_IsExceptionPending: SUCCESS");
524        // 处理异常挂起的情况
525        JSVM_Value result = nullptr;
526        status = OH_JSVM_GetAndClearLastException(env, &result);
527        if (status != JSVM_OK) {
528            return nullptr;
529        }
530        // 将处理的异常返回出去
531        return result;
532    } else {
533        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_IsExceptionPending: FAILED");
534    }
535    return nullptr;
536}
537// JsVmIsExceptionPending注册回调
538static JSVM_CallbackStruct param[] = {
539    {.data = nullptr, .callback = JsVmIsExceptionPending},
540};
541static JSVM_CallbackStruct *method = param;
542// JsVmIsExceptionPending方法别名,供JS调用
543static JSVM_PropertyDescriptor descriptor[] = {
544    {"jsVmIsExceptionPending", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
545};
546// 样例测试js
547const char *srcCallNative = R"JS(jsVmIsExceptionPending();)JS";
548```
549
550预期输出结果
551```ts
552JSVM API OH_JSVM_IsExceptionPending: SUCCESS
553```
554
555### OH_JSVM_GetLastErrorInfo
556
557用于获取调用JSVM接口最后一次发生的错误信息(接口返回值不为JSVM_OK),包括错误码、错误消息以及错误堆栈信息,即使存在挂起的JavaScript异常,也可以调用此API。
558注意: 通过OH_JSVM_ThrowError等接口主动触发的Error不会被该接口获取,除非调用接口时返回值不为JSVM_OK。
559
560cpp部分代码
561
562```cpp
563// hello.cpp
564// OH_JSVM_GetLastErrorInfo的样例方法
565static JSVM_Value JsVmGetLastErrorInfo(JSVM_Env env, JSVM_CallbackInfo info) {
566    // 获取输入参数(这里以字符串message作为参数传入)
567    size_t argc = 1;
568    JSVM_Value args[1] = {nullptr};
569    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
570    // 将传入的字符串参数以OH_JSVM_GetValueInt32取出,主动制造错误
571    int32_t value = 0;
572    OH_JSVM_GetValueInt32(env, args[0], &value);
573    // 调用接口OH_JSVM_GetLastErrorInfo获取最后一次错误信息
574    const JSVM_ExtendedErrorInfo *errorInfo;
575    OH_JSVM_GetLastErrorInfo(env, &errorInfo);
576
577    // 取出错误消息作为返回值带出去打印
578    JSVM_Value result = nullptr;
579    OH_LOG_INFO(LOG_APP,
580                "JSVM API OH_JSVM_GetLastErrorInfo: SUCCESS, error message is %{public}s, error code is %{public}d",
581                errorInfo->errorMessage, errorInfo->errorCode);
582    // 对异常进行处理,防止程序由于抛异常而退出
583    JSVM_Value result1 = nullptr;
584    OH_JSVM_GetAndClearLastException(env, &result1);
585    OH_JSVM_CreateInt32(env, errorInfo->errorCode, &result);
586    return result;
587}
588// JsVmGetLastErrorInfo注册回调
589static JSVM_CallbackStruct param[] = {
590    {.data = nullptr, .callback = JsVmGetLastErrorInfo},
591};
592static JSVM_CallbackStruct *method = param;
593// JsVmGetLastErrorInfo方法别名,供JS调用
594static JSVM_PropertyDescriptor descriptor[] = {
595    {"jsVmGetLastErrorInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
596};
597// 样例测试js
598const char *srcCallNative = R"JS(jsVmGetLastErrorInfo();)JS";}
599```
600
601预期输出结果
602```ts
603JSVM API OH_JSVM_GetLastErrorInfo: SUCCESS, error message is A number was expected, error code is 6
604```