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