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