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```