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