• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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++中需要创建一个错误对象时,可以使用这些函数。创建的错误对象可以使用napi_throw抛出到ArkTS |
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
30## 使用示例
31
32JSVM-API接口开发流程参考[使用JSVM-API实现JS与C/C++语言交互开发流程](use-jsvm-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。
33
34### OH_JSVM_Throw
35
36用于在JSVM-NAPI模块中抛出JavaScript异常的函数。当在本机代码中发生错误或检测到不符合预期的情况时,可以使用此接口来抛出一个Javascript异常,使其能够被捕获并处理。
37
38### OH_JSVM_CreateError
39
40创建并获取一个带文本信息的JavaScript Error。
41
42cpp部分代码
43
44```cpp
45// hello.cpp
46#include "napi/native_api.h"
47#include "ark_runtime/jsvm.h"
48// JsVmThrow注册回调
49static JSVM_CallbackStruct param[] = {
50    {.data = nullptr, .callback = JsVmCreateThrowError},
51};
52static JSVM_CallbackStruct *method = param;
53// JsVmThrow方法别名,供JS调用
54static JSVM_PropertyDescriptor descriptor[] = {
55    {"jsVmCreateThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
56};
57static JSVM_Value JsVmCreateThrowError(JSVM_Env env, JSVM_CallbackInfo info) {
58{
59    size_t argc = 1;
60    JSVM_Value argv[1] = {nullptr};
61    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
62    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
63    JSVM_Value errorCode = nullptr;
64    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
65    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
66    JSVM_Value errorMessage = nullptr;
67    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
68    // 创建一个JavaScript对象error
69    JSVM_Value error = nullptr;
70    OH_JSVM_CreateError(env, errorCode, errorMessage, &error);
71    // 通过OH_JSVM_Throw接口将对象抛出
72    OH_JSVM_Throw(env, error);
73    return nullptr;
74}
75```
76
77接口声明
78
79ArkTS侧示例代码
80
81```ts
82import hilog from "@ohos.hilog"
83// 通过import的方式,引入Native能力。
84import napitest from "libentry.so"
85let script: string = `
86   jsVmCreateThrowError();
87`
88try {
89  testNapi.runJsVm(script);
90} catch (error) {
91  hilog.error(0x0000, 'testTag', 'Test OH_JSVM_Throw errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message);
92}
93```
94
95### OH_JSVM_ThrowError
96
97用于抛出一个带文本信息的JS Error。
98
99cpp部分代码
100
101```cpp
102// hello.cpp
103#include "napi/native_api.h"
104#include "ark_runtime/jsvm.h"
105// JsVmThrowError注册回调
106static JSVM_CallbackStruct param[] = {
107    {.data = nullptr, .callback = JsVmThrowError},
108};
109static JSVM_CallbackStruct *method = param;
110// JsVmThrowError方法别名,供JS调用
111static JSVM_PropertyDescriptor descriptor[] = {
112    {"jsVmThrowError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
113};
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;
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, nullptr, buffer);
131        delete[] buffer;
132    }
133    return nullptr;
134}
135```
136
137ArkTS侧示例代码
138
139```ts
140import hilog from "@ohos.hilog"
141// 通过import的方式,引入Native能力。
142import napitest from "libentry.so"
143let firstScript: string = `jsVmThrowError()`
144try {
145    napitest.runJsVm(firstScript);
146} catch (error) {
147    hilog.error(0x0000, 'testTag', 'Test OH_JSVM_ThrowError errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message);
148}
149
150try {
151    let errMessage = `\"has Error\"`
152    let sencodeScript: string =
153        `
154            jsVmThrowError(${errMessage})
155        `
156    napitest.runJsVm(sencodeScript);
157} catch (error) {
158  hilog.error(0x0000, 'testTag', 'Test OH_JSVM_ThrowError errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message);
159}
160```
161
162### OH_JSVM_ThrowTypeError
163
164创建并获取一个带文本信息的JavaScript TypeError。
165
166cpp部分代码
167
168```cpp
169// hello.cpp
170#include "napi/native_api.h"
171#include "ark_runtime/jsvm.h"
172// JsVmThrowTypeError注册回调
173static JSVM_CallbackStruct param[] = {
174    {.data = nullptr, .callback = JsVmThrowTypeError},
175};
176static JSVM_CallbackStruct *method = param;
177// JsVmThrowTypeError方法别名,供JS调用
178static JSVM_PropertyDescriptor descriptor[] = {
179    {"jsVmThrowTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
180};
181// 这里直接抛出一个带有errorMessage的TypeError
182static JSVM_Value JsVmThrowTypeError(JSVM_Env env, JSVM_CallbackInfo info)
183{
184    size_t argc = 1;
185    JSVM_Value argv[1] = {nullptr};
186    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
187    if (argc == 0) {
188        // 如果没有传递参数,直接抛出异常
189        OH_JSVM_ThrowTypeError(env, "-1", "throwing type error");
190    } else if (argc == 1) {
191        size_t length;
192        // 通过入参获取到javaScript侧传入的字符串长度
193        OH_JSVM_GetValueStringUtf8(env, argv[0], nullptr, 0, &length);
194        char *buffer = new char[length + 1];
195        // 获取入参的字符串内容
196        OH_JSVM_GetValueStringUtf8(env, argv[0], buffer, length + 1, nullptr);
197        // 作为error信息填入到OH_JSVM_ThrowError接口中
198        OH_JSVM_ThrowTypeError(env, nullptr, buffer);
199        delete[] buffer;
200    }
201    return nullptr;
202}
203```
204
205ArkTS侧示例代码
206
207```ts
208import hilog from "@ohos.hilog"
209// 通过import的方式,引入Native能力。
210import napitest from "libentry.so"
211try {
212  let script: string =
213  `
214      jsVmThrowTypeError()
215  `
216  napitest.runJsVm(script);
217} catch (error) {
218  hilog.error(0x0000, 'testTag', 'Test OH_JSVM_TypeError');
219}
220
221try {
222  let script: string =
223  `
224      jsVmThrowTypeError("has type Error")
225  `
226  napitest.runJsVm(script);
227} catch (error) {
228  hilog.error(0x0000, 'testTag', 'Test OH_JSVM_TypeError');
229}
230```
231
232### OH_JSVM_ThrowRangeError
233
234创建并获取一个带文本信息的JavaScript RangeError。
235
236cpp部分代码
237
238```cpp
239// hello.cpp
240#include "napi/native_api.h"
241#include "ark_runtime/jsvm.h"
242// JsVmThrowRangeError注册回调
243static JSVM_CallbackStruct param[] = {
244    {.data = nullptr, .callback = JsVmThrowRangeError},
245};
246static JSVM_CallbackStruct *method = param;
247// JsVmThrowRangeError方法别名,供JS调用
248static JSVM_PropertyDescriptor descriptor[] = {
249    {"jsVmThrowRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
250};
251static JSVM_Value JsVmThrowRangeError(JSVM_Env env, JSVM_CallbackInfo info)
252{
253    // js侧传入两个参数
254    size_t argc = 2;
255    JSVM_Value argv[2] = {nullptr};
256    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
257    // 如果传入参数个数不为2
258    if (argc != 2) {
259        // 这里抛出一个RangeError
260        OH_JSVM_ThrowRangeError(env, "OH_JSVM_ThrowRangeError", "Expected two numbers as arguments");
261        return nullptr;
262    }
263    JSVM_Value result = nullptr;
264    OH_JSVM_GetBoolean(env, true, &result);
265    return result;
266}
267```
268
269ArkTS侧示例代码
270
271```ts
272import hilog from "@ohos.hilog"
273// 通过import的方式,引入Native能力。
274import napitest from "libentry.so"
275try {
276  let script: string =
277  `
278      jsVmThrowRangeError(1)
279  `
280  napitest.runJsVm(script);
281} catch (error) {
282  hilog.error(0x0000, 'testTag', 'Test OH_JSVM_ThrowRangeError');
283}
284```
285
286### OH_JSVM_ThrowSyntaxError
287
288创建并获取一个带文本信息的JavaScript SyntaxError。
289
290cpp部分代码
291
292```cpp
293// hello.cpp
294#include "napi/native_api.h"
295#include "ark_runtime/jsvm.h"
296// JsVmThrowSyntaxError注册回调
297static JSVM_CallbackStruct param[] = {
298    {.data = nullptr, .callback = JsVmThrowSyntaxError},
299};
300static JSVM_CallbackStruct *method = param;
301// JsVmThrowSyntaxError方法别名,供JS调用
302static JSVM_PropertyDescriptor descriptor[] = {
303    {"jsVmThrowSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
304};
305static JSVM_Value JsVmThrowSyntaxError(JSVM_Env env, JSVM_CallbackInfo info) {
306    // JS侧传入运行的JS代码
307    size_t argc = 1;
308    JSVM_Value argv[1] = {nullptr};
309    OH_JSVM_GetCbInfo(env, info, &argc, argv, nullptr, nullptr);
310    JSVM_Script script = nullptr;
311    // 通过OH_JSVM_CompileScript接口编译JS代码
312    OH_JSVM_CompileScript(env, argv[0], nullptr, 0, true, nullptr, &script);
313    JSVM_Value scriptResult = nullptr;
314    // 通过OH_JSVM_RunScript接口运行JS代码
315    JSVM_Status status = OH_JSVM_RunScript(env, script, &scriptResult);
316    if (status != JSVM_OK) {
317        // 如果JSVM_RunScript接口返回状态不为JSVM_OK,则抛出一个SyntaxError
318        OH_JSVM_ThrowSyntaxError(env, "JsVmThrowSyntaxError", "throw syntax error");
319        return nullptr;
320    }
321    JSVM_Value result = nullptr;
322    OH_JSVM_GetBoolean(env, true, &result);
323    return result;
324}
325```
326
327ArkTS侧示例代码
328
329```ts
330import hilog from "@ohos.hilog"
331// 通过import的方式,引入Native能力。
332import napitest from "libentry.so"
333try {
334    let script: string =` jsVmThrowSyntaxError()`
335    napitest.runJsVm(script);
336} catch(error) {
337    hilog.error(0x0000, 'testTag', 'Test jsVmThrowSyntaxError error message: %{public}s,', error.message);
338}
339```
340
341### OH_JSVM_IsError
342
343用于判断给定的JSVM_Value是否表示一个error对象。
344
345cpp部分代码
346
347```cpp
348// hello.cpp
349#include "napi/native_api.h"
350#include "ark_runtime/jsvm.h"
351// JsVmIsError注册回调
352static JSVM_CallbackStruct param[] = {
353    {.data = nullptr, .callback = JsVmIsError},
354};
355static JSVM_CallbackStruct *method = param;
356// JsVmIsError方法别名,供JS调用
357static JSVM_PropertyDescriptor descriptor[] = {
358    {"jsVmIsError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
359};
360static JSVM_Value JsVmIsError(JSVM_Env env, JSVM_CallbackInfo info)
361{
362    size_t argc = 1;
363    JSVM_Value args[1] = {nullptr};
364    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
365    // 调用接口OH_JSVM_IsError判断入参是否为一个error对象
366    bool result = false;
367    // 如果JSVM_Value为一个error对象,则设置result为true的布尔值,否则设置为false
368    OH_JSVM_IsError(env, args[0], &result);
369    // 取出result通过OH_JSVM_GetBoolean接口将取出的bool值转换为JSVM_Value类型的值返回出去
370    JSVM_Value returnValue = nullptr;
371    OH_JSVM_GetBoolean(env, result, &returnValue);
372    return returnValue;
373}
374```
375
376ArkTS侧示例代码
377
378```ts
379import hilog from "@ohos.hilog"
380// 通过import的方式,引入Native能力。
381import napitest from "libentry.so"
382let script: string =
383  `
384      jsVmIsError(Error())
385  `
386const isError = napitest.runJsVm(script);
387hilog.info(0x0000, 'testTag', 'Test OH_JSVM_IsError error: %{public}s', isError);
388```
389
390### OH_JSVM_CreateTypeError
391
392创建并获取一个带文本信息的JavaScript TypeError。
393
394cpp部分代码
395
396```cpp
397// hello.cpp
398#include "napi/native_api.h"
399#include "ark_runtime/jsvm.h"
400#include <hilog/log.h>
401
402// JsVmCreateTypeError注册回调
403static JSVM_CallbackStruct param[] = {
404    {.data = nullptr, .callback = JsVmCreateTypeError},
405};
406static JSVM_CallbackStruct *method = param;
407// JsVmCreateTypeError方法别名,供JS调用
408static JSVM_PropertyDescriptor descriptor[] = {
409    {"jsVmCreateTypeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
410};
411static JSVM_Value JsVmCreateTypeError(JSVM_Env env, JSVM_CallbackInfo info) {
412    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
413    JSVM_Value errorCode = nullptr;
414    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
415    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
416    JSVM_Value errorMessage = nullptr;
417    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
418    JSVM_Value result = nullptr;
419    JSVM_Status status = OH_JSVM_CreateTypeError(env, errorCode, errorMessage, &result);
420    if (status == JSVM_OK) {
421        OH_LOG_INFO(LOG_APP, "JSVM API Create TypeError SUCCESS");
422    } else {
423        OH_LOG_INFO(LOG_APP, "JSVM API Create TypeError FAILED");
424    }
425    return result;
426}
427```
428
429ArkTS侧示例代码
430
431```ts
432import hilog from "@ohos.hilog"
433// 通过import的方式,引入Native能力。
434import napitest from "libentry.so"
435let script: string =`
436     jsVmCreateTypeError()
437  `
438napitest.runJsVm(script);
439```
440
441### OH_JSVM_CreateRangeError
442
443创建并获取一个带文本信息的JavaScript RangeError。
444
445cpp部分代码
446
447```cpp
448// hello.cpp
449#include "napi/native_api.h"
450#include "ark_runtime/jsvm.h"
451#include <hilog/log.h>
452
453// JsVmCreateRangeError注册回调
454static JSVM_CallbackStruct param[] = {
455    {.data = nullptr, .callback = JsVmCreateRangeError},
456};
457static JSVM_CallbackStruct *method = param;
458// JsVmCreateRangeError方法别名,供JS调用
459static JSVM_PropertyDescriptor descriptor[] = {
460    {"jsVmCreateRangeError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
461};
462static JSVM_Value JsVmCreateRangeError(JSVM_Env env, JSVM_CallbackInfo info) {
463    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
464    JSVM_Value errorCode = nullptr;
465    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
466    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
467    JSVM_Value errorMessage = nullptr;
468    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
469    JSVM_Value result = nullptr;
470    JSVM_Status status = OH_JSVM_CreateRangeError(env, errorCode, errorMessage, &result);
471    if (status == JSVM_OK) {
472        OH_LOG_INFO(LOG_APP, "JSVM API CreateRangeError SUCCESS");
473    } else {
474        OH_LOG_INFO(LOG_APP, "JSVM API CreateRangeError FAILED");
475    }
476    return result;
477}
478```
479
480ArkTS侧示例代码
481
482```ts
483import hilog from "@ohos.hilog"
484// 通过import的方式,引入Native能力。
485import napitest from "libentry.so"
486let script: string =
487   `
488    jsVmCreateRangeError()
489   `
490napitest.runJsVm(script);
491```
492
493### OH_JSVM_CreateSyntaxError
494
495cpp部分代码
496
497```cpp
498// hello.cpp
499#include "napi/native_api.h"
500#include "ark_runtime/jsvm.h"
501#include <hilog/log.h>
502
503
504// JsVmCreateSyntaxError注册回调
505static JSVM_CallbackStruct param[] = {
506    {.data = nullptr, .callback = JsVmCreateSyntaxError},
507};
508static JSVM_CallbackStruct *method = param;
509// JsVmThrow方法别名,供JS调用
510static JSVM_PropertyDescriptor descriptor[] = {
511    {"jsVmCreateSyntaxError", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
512};
513static JSVM_Value JsVmCreateSyntaxError(JSVM_Env env, JSVM_CallbackInfo info) {
514    // 在JSVM环境中创建一个字符串,并将其存储在errorCode变量中
515    JSVM_Value errorCode = nullptr;
516    OH_JSVM_CreateStringUtf8(env, "-1", JSVM_AUTO_LENGTH, &errorCode);
517    // 在JSVM环境中创建一个字符串,并将其存储在errorMessage变量中
518    JSVM_Value errorMessage = nullptr;
519    OH_JSVM_CreateStringUtf8(env, "HasError", JSVM_AUTO_LENGTH, &errorMessage);
520    JSVM_Value result = nullptr;
521    JSVM_Status status =  OH_JSVM_CreateSyntaxError(env, errorCode, errorMessage, &result);
522    if (status == JSVM_OK) {
523        OH_LOG_INFO(LOG_APP, "JSVM API CreateSyntaxError SUCCESS");
524    } else {
525        OH_LOG_INFO(LOG_APP, "JSVM API CreateSyntaxError FAILED");
526    }
527    return result;
528}
529```
530
531ArkTS侧示例代码
532
533```ts
534import hilog from "@ohos.hilog"
535// 通过import的方式,引入Native能力。
536import napitest from "libentry.so"
537let script: string =
538  `
539  let error = jsVmCreateSyntaxError()
540  `
541napitest.runJsVm(script);
542```
543
544### OH_JSVM_GetAndClearLastException
545
546用于获取并清除最近一次出现的异常。
547
548cpp部分代码
549
550```cpp
551// hello.cpp
552#include "napi/native_api.h"
553#include "ark_runtime/jsvm.h"
554#include <hilog/log.h>
555
556// JsVmGetAndClearLastException注册回调
557static JSVM_CallbackStruct param[] = {
558    {.data = nullptr, .callback = JsVmGetAndClearLastException},
559};
560static JSVM_CallbackStruct *method = param;
561// JsVmGetAndClearLastException方法别名,供JS调用
562static JSVM_PropertyDescriptor descriptor[] = {
563    {"jsVmGetAndClearLastException", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
564};
565static JSVM_Value JsVmGetAndClearLastException(JSVM_Env env, JSVM_CallbackInfo info) {
566    // 抛出异常,创造异常情况
567    OH_JSVM_ThrowError(env, "OH_JSVM_ThrowError errorCode", "OH_JSVM_ThrowError errorMessage");
568    // 调用OH_JSVM_GetAndClearLastException接口获取并清除最后一个未处理的异常。即使存在挂起的JavaScript异常,也可以调用此API
569    JSVM_Value result = nullptr;
570    JSVM_Status status = OH_JSVM_GetAndClearLastException(env, &result);
571    if (status != JSVM_OK) {
572        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_GetAndClearLastException FAILED");
573    } else {
574        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_GetAndClearLastException SUCCESS");
575    }
576    return result;
577}
578```
579
580ArkTS侧示例代码
581
582```ts
583import hilog from "@ohos.hilog"
584// 通过import的方式,引入Native能力。
585import napitest from "libentry.so"
586let script: string =
587 `
588   jsVmGetAndClearLastException()
589`
590napitest.runJsVm(script);
591```
592
593### OH_JSVM_IsExceptionPending
594
595用于判断是否出现了异常。
596
597cpp部分代码
598
599```cpp
600// hello.cpp
601#include "napi/native_api.h"
602#include "ark_runtime/jsvm.h"
603#include <hilog/log.h>
604
605// JsVmIsExceptionPending注册回调
606static JSVM_CallbackStruct param[] = {
607    {.data = nullptr, .callback = JsVmIsExceptionPending},
608};
609static JSVM_CallbackStruct *method = param;
610// JsVmIsExceptionPending方法别名,供JS调用
611static JSVM_PropertyDescriptor descriptor[] = {
612    {"jsVmIsExceptionPending", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
613};
614static JSVM_Value JsVmIsExceptionPending(JSVM_Env env, JSVM_CallbackInfo info) {
615    JSVM_Status status;
616    bool isExceptionPending = false;
617    // 在执行一些可能引发异常的操作后
618    OH_JSVM_ThrowError(env, "OH_JSVM_ThrowError errorCode", "OH_JSVM_ThrowError errorMessage");
619    // 检查当前环境中是否有异常挂起
620    status = OH_JSVM_IsExceptionPending(env, &isExceptionPending);
621    if (status != JSVM_OK) {
622        return nullptr;
623    }
624    if (isExceptionPending) {
625        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_IsExceptionPending: SUCCESS");
626        // 处理异常挂起的情况
627        JSVM_Value result = nullptr;
628        status = OH_JSVM_GetAndClearLastException(env, &result);
629        if (status != JSVM_OK) {
630            return nullptr;
631        }
632        // 将处理的异常返回出去
633        return result;
634    } else {
635        OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_IsExceptionPending: FAILED");
636    }
637    return nullptr;
638}
639```
640
641ArkTS侧示例代码
642
643```ts
644import hilog from "@ohos.hilog"
645// 通过import的方式,引入Native能力。
646import napitest from "libentry.so"
647let script: string =
648              `
649    let error = jsVmIsExceptionPending()
650    `
651napitest.runJsVm(script);
652```
653
654### OH_JSVM_GetLastErrorInfo
655
656用于获取最后一次发生的错误信息,包括错误码、错误消息以及错误进栈信息,即使存在挂起的JavaScript异常,也可以调用此API。
657
658cpp部分代码
659
660```cpp
661// hello.cpp
662#include "napi/native_api.h"
663#include "ark_runtime/jsvm.h"
664#include <hilog/log.h>
665
666// JsVmGetLastErrorInfo注册回调
667static JSVM_CallbackStruct param[] = {
668    {.data = nullptr, .callback = JsVmGetLastErrorInfo},
669};
670static JSVM_CallbackStruct *method = param;
671// JsVmGetLastErrorInfo方法别名,供JS调用
672static JSVM_PropertyDescriptor descriptor[] = {
673    {"jsVmGetLastErrorInfo", nullptr, method++, nullptr, nullptr, nullptr, JSVM_DEFAULT},
674};
675static JSVM_Value JsVmGetLastErrorInfo(JSVM_Env env, JSVM_CallbackInfo info) {
676    // 获取输入参数(这里以字符串message作为参数传入)
677    size_t argc = 1;
678    JSVM_Value args[1] = {nullptr};
679    OH_JSVM_GetCbInfo(env, info, &argc, args, nullptr, nullptr);
680    // 将传入的字符串参数以OH_JSVM_GetValueInt32取出,主动制造错误
681    int32_t value = 0;
682     OH_JSVM_GetValueInt32(env, args[0], &value);
683    // 调用接口OH_JSVM_GetLastErrorInfo获取最后一次错误信息
684    const JSVM_ExtendedErrorInfo *errorInfo;
685    OH_JSVM_GetLastErrorInfo(env, &errorInfo);
686    // 取出错误消息作为返回值带出去打印
687    JSVM_Value result = nullptr;
688    OH_LOG_INFO(LOG_APP, "JSVM API OH_JSVM_GetLastErrorInfo: SUCCESS");
689
690    OH_JSVM_CreateInt32(env, errorInfo->errorCode, &result);
691    return result;
692}
693```
694
695ArkTS侧示例代码
696
697```ts
698import hilog from "@ohos.hilog"
699// 通过import的方式,引入Native能力。
700import napitest from "libentry.so"
701let script: string = `jsVmGetLastErrorInfo()`
702napitest.runJsVm(script);
703```
704