1# 使用Node-API接口进行错误处理开发 2<!--Kit: NDK--> 3<!--Subsystem: arkcompiler--> 4<!--Owner: @xliu-huanwei; @shilei123; @huanghello--> 5<!--Designer: @shilei123--> 6<!--Tester: @kirl75; @zsw_zhushiwei--> 7<!--Adviser: @fang-jinxu--> 8 9## 简介 10 11使用Node-API接口进行错误处理,使得在Node-API模块中能够更好地管理和响应错误情况。通过合理使用这些函数,可以提高模块的稳定性和可靠性。 12 13## 基本概念 14 15在ArkTS编程中,异常和错误是常见的概念。异常表示发生了某种意外情况,而错误则指示程序无法正确执行某些操作。Node-API提供了一系列方法来帮助开发者在Node-API模块中处理ArkTS中的异常和错误。下面是一些基本概念: 16 17- **异常(Exception)**:在程序执行过程中可能会出现的意外情况,可以是语法错误、运行时错误或逻辑错误,例如除以零或对未定义变量的操作。 18- **错误(Error)**:表示程序无法顺利执行某些操作,可以是由底层系统、API函数或开发者自定义的。 19- **类型错误(Type Error)**:表示操作或值的类型不符合预期,通常是由错误的数据类型导致的。 20- **范围错误(Range Error)**:表示一个值不在预期的范围内,例如对数组长度之外的索引进行访问。 21 22这些基本概念在异常和错误处理中非常重要,开发者需要通过适当的方法来捕获、处理或向用户报告这些异常和错误,以确保程序的稳定性和正确性。Node-API提供的方法可以帮助开发者在Node-API模块中处理ArkTS中的异常和错误。 23 24## 场景和功能介绍 25 26以下Node-API接口主要用于与ArkTS交互时处理错误和异常情况。其使用场景如下: 27| 接口 | 描述 | 28| -------- | -------- | 29| napi_create_error、napi_create_type_error、napi_create_range_error | 在C/C++中需要创建一个错误对象时,可以使用这些函数。创建的错误对象可以使用napi_throw抛出到ArkTS。 | 30| napi_throw | 当在C/C++中出现了错误或异常情况时,通过使用napi_create_error或napi_get_last_error_info方法创建或获取ArkTS Error对象,使用该方法抛出已有的ArkTS Error对象。 | 31| napi_throw_error、napi_throw_type_error、napi_throw_range_error | 当在C/C++中出现了错误或异常情况时,可以使用这些函数来抛出ArkTS中的异常。 | 32| napi_is_error | 检查一个napi_value是否代表一个错误对象时,可以使用这个函数。 | 33| napi_get_and_clear_last_exception | 当你需要获取最近一次出现的异常,并将异常队列清空时,可以使用这个函数。 | 34| napi_is_exception_pending | 当你需要判断是否有未处理的异常时,可以使用这个函数。 | 35| napi_fatal_error | 当遇到严重错误或不可恢复的情况时,可以使用这个函数引发致命错误来立即终止进程。 | 36| napi_fatal_exception | 抛出一个致命异常并终止进程, 同时产生相应的crash日志。| 37 38## 使用示例 39 40Node-API接口开发流程参考[使用Node-API实现跨语言交互开发流程](use-napi-process.md),本文仅对接口对应C++及ArkTS相关代码进行展示。 41 42### napi_get_last_error_info 43 44用于获取最后一次发生的错误信息,包括错误码、错误消息以及错误进栈信息,即使存在挂起的ArkTS异常,也可以调用此API。 45 46cpp部分代码 47 48```cpp 49#include "napi/native_api.h" 50static napi_value GetLastErrorInfo(napi_env env, napi_callback_info info) 51{ 52 // 获取输入参数(这里以字符串message作为参数传入) 53 size_t argc = 1; 54 napi_value args[1] = {nullptr}; 55 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 56 // 将传入的字符串参数以napi_get_value_int32取出,主动制造错误 57 int32_t value = 0; 58 napi_status status = napi_get_value_int32(env, args[0], &value); 59 // 接口使用错误,故返回值不为napi_ok 60 if (status != napi_ok) { 61 OH_LOG_INFO(LOG_APP, "Test Node-API napi_get_value_int32 return status, status is not equal to napi_ok."); 62 } 63 64 // 调用接口napi_get_last_error_info获取最后一次错误信息 65 const napi_extended_error_info *errorInfo; 66 napi_get_last_error_info(env, &errorInfo); 67 // 取出错误码与接口调用错误后其返回值作比较 68 if (errorInfo->error_code == status) { 69 OH_LOG_INFO(LOG_APP, "Test Node-API napi_get_last_error_info return errorInfo, error_code equal to status."); 70 } 71 72 // 取出错误消息作为返回值带出去打印 73 napi_value result = nullptr; 74 napi_create_string_utf8(env, errorInfo->error_message, NAPI_AUTO_LENGTH, &result); 75 return result; 76} 77``` 78<!-- @[napi_get_last_error_info](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 79 80接口声明 81 82```ts 83// index.d.ts 84export const getLastErrorInfo: (str: string) => string; 85``` 86<!-- @[napi_get_last_error_info_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 87 88ArkTS侧示例代码 89 90```ts 91import { hilog } from '@kit.PerformanceAnalysisKit'; 92import testNapi from 'libentry.so'; 93try { 94 hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_last_error_info: %{public}s', testNapi.getLastErrorInfo('message')); 95} catch (error) { 96 hilog.error(0x0000, 'testTag', 'Test Node-API napi_get_last_error_info error: %{public}s', error); 97} 98``` 99<!-- @[ark_napi_get_last_error_info](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 100 101### napi_create_type_error 102 103创建并获取一个带文本信息的ArkTS TypeError。 104 105cpp部分代码 106 107```cpp 108#include "napi/native_api.h" 109 110static napi_value CreateTypeError(napi_env env, napi_callback_info info) 111{ 112 // 构造errorCode和errorMessage 113 napi_value errorCode = nullptr; 114 napi_create_string_utf8(env, "napi_create_error errorCode", NAPI_AUTO_LENGTH, &errorCode); 115 napi_value errorMessage = nullptr; 116 napi_create_string_utf8(env, "napi_create_error errorMessage", NAPI_AUTO_LENGTH, &errorMessage); 117 // 调用napi_create_type_error创建一个typeError错误对象 118 napi_value error = nullptr; 119 napi_create_type_error(env, errorCode, errorMessage, &error); 120 return error; 121} 122``` 123<!-- @[napi_create_type_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 124 125接口声明 126 127```ts 128// index.d.ts 129export const createTypeError: () => Error; 130``` 131<!-- @[napi_create_type_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 132 133ArkTS侧示例代码 134 135```ts 136import { hilog } from '@kit.PerformanceAnalysisKit'; 137import testNapi from 'libentry.so'; 138try { 139 throw testNapi.createTypeError(); 140} catch (error) { 141 hilog.error(0x0000, 'testTag', 'Test Node-API napi_create_type_error errorCode: %{public}s, errorMessage %{public}s', error.code, error.message); 142} 143``` 144<!-- @[ark_napi_create_type_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 145 146### napi_create_range_error 147 148创建并获取一个带文本信息的ArkTS RangeError。 149 150cpp部分代码 151 152```cpp 153#include "napi/native_api.h" 154 155static napi_value CreateRangeError(napi_env env, napi_callback_info info) 156{ 157 // 构造errorCode和errorMessage 158 napi_value errorCode = nullptr; 159 napi_create_string_utf8(env, "napi_create_error errorCode", NAPI_AUTO_LENGTH, &errorCode); 160 napi_value errorMessage = nullptr; 161 napi_create_string_utf8(env, "napi_create_error errorMessage", NAPI_AUTO_LENGTH, &errorMessage); 162 // 调用napi_create_range_error创建一个typeError错误对象 163 napi_value error = nullptr; 164 napi_create_range_error(env, errorCode, errorMessage, &error); 165 return error; 166} 167``` 168<!-- @[napi_create_range_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 169 170接口声明 171 172```ts 173// index.d.ts 174export const createRangeError: () => Error; 175``` 176<!-- @[napi_create_range_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 177 178ArkTS侧示例代码 179 180```ts 181import { hilog } from '@kit.PerformanceAnalysisKit'; 182import testNapi from 'libentry.so'; 183try { 184 throw testNapi.createRangeError(); 185} catch (error) { 186 hilog.error(0x0000, 'testTag', 'Test Node-API napi_create_range_error errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 187} 188``` 189<!-- @[ark_napi_create_range_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 190 191### napi_create_error 192 193创建并获取一个带文本信息的ArkTS Error。 194 195### napi_throw 196 197用于在Node-API模块中抛出ArkTS异常的函数。当在本地代码中发生错误或检测到不符合预期的情况时,可以使用此接口来抛出一个ArkTS异常,使其能够被捕获并处理。 198 199cpp部分代码 200 201```cpp 202#include "napi/native_api.h" 203 204static napi_value NapiThrow(napi_env env, napi_callback_info info) 205{ 206 // 代码中发生某些错误后,可执行以下操作抛出异常 207 // 在Node-API环境中创建一个字符串,并将其存储在errorCode变量中 208 napi_value errorCode = nullptr; 209 napi_create_string_utf8(env, "throw errorCode", NAPI_AUTO_LENGTH, &errorCode); 210 // 在Node-API环境中创建一个字符串,并将其存储在errorMessage变量中 211 napi_value errorMessage = nullptr; 212 napi_create_string_utf8(env, "throw errorMessage", NAPI_AUTO_LENGTH, &errorMessage); 213 // 创建一个ArkTS对象error 214 napi_value error = nullptr; 215 napi_create_error(env, errorCode, errorMessage, &error); 216 // 通过napi_throw接口将对象抛出 217 napi_throw(env, error); 218 return nullptr; 219} 220``` 221<!-- @[napi_create_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 222 223接口声明 224 225```ts 226// index.d.ts 227export const napiThrow: () => void; 228``` 229<!-- @[napi_create_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 230 231ArkTS侧示例代码 232 233```ts 234import { hilog } from '@kit.PerformanceAnalysisKit'; 235import testNapi from 'libentry.so'; 236try { 237 testNapi.napiThrow(); 238} catch (error) { 239 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 240} 241``` 242<!-- @[ark_napi_create_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 243 244### napi_throw_error 245 246用于抛出一个带文本信息的ArkTS Error。 247 248cpp部分代码 249 250```cpp 251#include "napi/native_api.h" 252 253// 这里直接抛出一个带有errorMessage的错误 254static napi_value NapiThrowErrorMessage(napi_env env, napi_callback_info info) 255{ 256 napi_throw_error(env, nullptr, "napi_throw_error throwing an error"); 257 return nullptr; 258} 259// 传入两个参数,在第二个参数,也就是除数为0的时候抛出一个错误 260static napi_value NapiThrowError(napi_env env, napi_callback_info info) 261{ 262 // ArkTS侧传入两个参数 263 size_t argc = 2; 264 napi_value argv[2] = {nullptr}; 265 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 266 // 将其转换为double类型的值作为被除数和除数 267 double dividend, divisor; 268 napi_get_value_double(env, argv[0], ÷nd); 269 napi_get_value_double(env, argv[1], &divisor); 270 // 在这里判断除数如果为0则直接抛出一个错误,errorCode为:DIVIDE_BY_ZERO,errorMessage为:Cannot divide by zero 271 if (divisor == 0) { 272 napi_throw_error(env, "DIVIDE_BY_ZERO", "Cannot divide by zero"); 273 } 274 return nullptr; 275} 276``` 277<!-- @[napi_throw_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 278 279接口声明 280 281```ts 282// index.d.ts 283export const napiThrowErrorMessage: () => void; 284export const napiThrowError: (dividend: number, divisor: number) => void; 285``` 286<!-- @[napi_throw_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 287 288ArkTS侧示例代码 289 290```ts 291import { hilog } from '@kit.PerformanceAnalysisKit'; 292import testNapi from 'libentry.so'; 293try { 294 testNapi.napiThrowErrorMessage(); 295} catch (error) { 296 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_error error code: %{public}s , message: %{public}s', error.code, error.message); 297} 298try { 299 testNapi.napiThrowError(5, 0); 300} catch (error) { 301 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_error errorCode: %{public}s , errorMessage: %{public}s', error.code, error.message); 302} 303``` 304<!-- @[ark_napi_throw_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 305 306### napi_throw_type_error 307 308抛出一个带文本信息的ArkTS TypeError。 309 310cpp部分代码 311 312```cpp 313#include "napi/native_api.h" 314 315// 这里直接抛出一个带有errorMessage的TypeError 316static napi_value ThrowTypeErrorMessage(napi_env env, napi_callback_info info) 317{ 318 napi_throw_type_error(env, nullptr, "napi_throw_type_error throwing an error"); 319 return nullptr; 320} 321// 传入一个类型不匹配的参数,判断类型不匹配之后抛出typeError 322static napi_value ThrowTypeError(napi_env env, napi_callback_info info) 323{ 324 // ArkTS侧传入一个参数 325 size_t argc = 1; 326 napi_value argv[1] = {nullptr}; 327 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 328 // 将传入参数转换为napi_valuetype类型的值 329 napi_valuetype valueType; 330 napi_typeof(env, argv[0], &valueType); 331 // 如果传入参数不为napi_number类型的值则抛出TypeError 332 if (valueType != napi_number) { 333 // 这里抛出一个既带有errorCode也带有errorMessage的TypeError 334 napi_throw_type_error(env, "napi_throw_type_error", "Argument must be a number"); 335 } 336 return nullptr; 337} 338``` 339<!-- @[napi_throw_type_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 340 341接口声明 342 343```ts 344// index.d.ts 345export const throwTypeErrorMessage: () => void; 346export const throwTypeError: (message: string) => void; 347``` 348<!-- @[napi_throw_type_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 349 350ArkTS侧示例代码 351 352```ts 353import { hilog } from '@kit.PerformanceAnalysisKit'; 354import testNapi from 'libentry.so'; 355try { 356 testNapi.throwTypeErrorMessage(); 357} catch (error) { 358 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_type_error errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 359} 360try { 361 testNapi.throwTypeError('str'); 362} catch (error) { 363 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_type_error errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 364} 365``` 366<!-- @[ark_napi_throw_type_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 367 368### napi_throw_range_error 369 370抛出一个带文本信息的ArkTS RangeError。 371 372cpp部分代码 373 374```cpp 375#include "napi/native_api.h" 376 377// 这里直接抛出一个带有errorMessage的RangeError 378static napi_value ThrowRangeErrorMessage(napi_env env, napi_callback_info info) 379{ 380 napi_throw_range_error(env, nullptr, "napi_throw_range_error one"); 381 return nullptr; 382} 383// 传入不匹配的参数个数,判断不匹配之后抛出rangeError 384static napi_value ThrowRangeError(napi_env env, napi_callback_info info) 385{ 386 // ArkTS侧传入两个参数 387 size_t argc = 2; 388 napi_value argv[2] = {nullptr}; 389 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 390 // 如果传入参数个数不为2 391 if (argc != 2) { 392 // 这里抛出一个RangeError 393 napi_throw_range_error(env, "napi_throw_range_error", "Expected two numbers as arguments"); 394 return nullptr; 395 } 396 // 下面将传入的两值相加并传出去 397 double numOne = 0; 398 double numTwo = 0; 399 napi_get_value_double(env, argv[0], &numOne); 400 napi_get_value_double(env, argv[1], &numTwo); 401 double result = numOne + numTwo; 402 napi_value resultValue; 403 napi_create_double(env, result, &resultValue); 404 return resultValue; 405} 406``` 407<!-- @[napi_throw_range_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 408 409接口声明 410 411```ts 412// index.d.ts 413export const throwRangeErrorMessage: () => void; 414export const throwRangeError: (num: number) => number | undefined; 415``` 416<!-- @[napi_throw_range_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 417 418ArkTS侧示例代码 419 420```ts 421import { hilog } from '@kit.PerformanceAnalysisKit'; 422import testNapi from 'libentry.so'; 423try { 424 testNapi.throwRangeErrorMessage(); 425} catch (error) { 426 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_range_error errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 427} 428 429try { 430 testNapi.throwRangeError(1); 431} catch (error) { 432 hilog.error(0x0000, 'testTag', 'Test Node-API napi_throw_range_error errorCode: %{public}s, errorMessage: %{public}s', error.code, error.message); 433} 434``` 435<!-- @[ark_napi_throw_range_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 436 437### napi_is_error 438 439用于判断给定的napi_value是否表示一个error对象。 440 441cpp部分代码 442 443```cpp 444#include "napi/native_api.h" 445 446static napi_value NapiIsError(napi_env env, napi_callback_info info) 447{ 448 // 接收一个入参 449 size_t argc = 1; 450 napi_value args[1] = {nullptr}; 451 napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 452 // 调用接口napi_is_error判断入参是否为一个error对象 453 bool result = false; 454 // 如果napi_value为一个error对象,则设置result为true的布尔值,否则设置为false 455 napi_is_error(env, args[0], &result); 456 // 取出result通过napi_get_boolean接口将取出的bool值转换为napi_value类型的值返回出去 457 napi_value returnValue = nullptr; 458 napi_get_boolean(env, result, &returnValue); 459 return returnValue; 460} 461``` 462<!-- @[napi_is_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 463 464接口声明 465 466```ts 467// index.d.ts 468export const napiIsError: <T>(obj: T) => boolean; 469``` 470<!-- @[napi_is_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 471 472ArkTS侧示例代码 473 474```ts 475import { hilog } from '@kit.PerformanceAnalysisKit'; 476import testNapi from 'libentry.so'; 477try { 478 throw new Error("throwing an error"); 479} catch (error) { 480 hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_error error: %{public}s', testNapi.napiIsError(error) 481 .toString()); 482 hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_error error: %{public}s', testNapi.napiIsError(1) 483 .toString()); 484} 485``` 486<!-- @[ark_napi_is_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 487 488### napi_get_and_clear_last_exception 489 490用于获取并清除最近一次出现的异常。 491 492cpp部分代码 493 494```cpp 495#include "napi/native_api.h" 496 497static napi_value GetAndClearLastException(napi_env env, napi_callback_info info) 498{ 499 // 抛出异常,创造异常情况 500 napi_throw_error(env, "napi_create_error errorCode", "napi_create_error errorMessage"); 501 // 调用napi_get_and_clear_last_exception接口获取并清除最后一个未处理的异常。即使存在挂起的ArkTS异常,也可以调用此API 502 napi_value result = nullptr; 503 napi_status status = napi_get_and_clear_last_exception(env, &result); 504 if (status != napi_ok) { 505 return nullptr; 506 } 507 return result; 508} 509``` 510<!-- @[napi_get_and_clear_last_exception](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 511 512接口声明 513 514```ts 515// index.d.ts 516export const getAndClearLastException: () => Error | undefined; 517``` 518<!-- @[napi_get_and_clear_last_exception_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 519 520ArkTS侧示例代码 521 522```ts 523import { hilog } from '@kit.PerformanceAnalysisKit'; 524import testNapi from 'libentry.so'; 525// 这里获取到最后一个未处理的异常 526hilog.info(0x0000, 'testTag', 'Test Node-API napi_get_and_clear_last_exception, error.message: %{public}s', 527 testNapi.getAndClearLastException()); 528``` 529<!-- @[ark_napi_get_and_clear_last_exception](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 530 531### napi_is_exception_pending 532 533用于判断是否出现了异常。 534 535cpp部分代码 536 537```cpp 538#include "napi/native_api.h" 539 540static napi_value IsExceptionPending(napi_env env, napi_callback_info info) 541{ 542 napi_status status; 543 bool isExceptionPending = false; 544 // 在执行一些可能引发异常的操作后 545 napi_throw_error(env, "napi_create_error errorCode", "napi_create_error errorMessage"); 546 // 检查当前环境中是否有异常挂起 547 status = napi_is_exception_pending(env, &isExceptionPending); 548 if (status != napi_ok) { 549 return nullptr; 550 } 551 if (isExceptionPending) { 552 // 处理异常挂起的情况 553 napi_value result = nullptr; 554 status = napi_get_and_clear_last_exception(env, &result); 555 if (status != napi_ok) { 556 return nullptr; 557 } 558 // 将处理的异常返回出去 559 return result; 560 } 561 return nullptr; 562} 563``` 564<!-- @[napi_is_exception_pending](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 565 566接口声明 567 568```ts 569// index.d.ts 570export const isExceptionPending: () => Object | undefined; 571``` 572<!-- @[napi_is_exception_pending_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 573 574ArkTS侧示例代码 575 576```ts 577import { hilog } from '@kit.PerformanceAnalysisKit'; 578import testNapi from 'libentry.so'; 579interface MyObject { 580 code: string; 581 message: string; 582} 583try { 584 let result = testNapi.isExceptionPending() as MyObject; 585 hilog.info(0x0000, 'testTag', 'Test Node-API napi_is_exception_pending, error.Code: %{public}s, error.message: %{public}s', 586 result.code, result.message); 587} catch (error) { 588 hilog.error(0x0000, 'testTag', 'Test Node-API napi_is_exception_pending error'); 589} 590``` 591<!-- @[ark_napi_is_exception_pending](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 592 593### napi_fatal_error 594 595用于引发致命错误以立即终止进程。在调用napi_fatal_error函数后,导致应用程序终止,因此应该慎重使用,避免在正常操作中频繁调用该函数。 596 597cpp部分代码 598 599```cpp 600#include "napi/native_api.h" 601 602static napi_value FatalError(napi_env env, napi_callback_info info) 603{ 604 // 请注意,使用napi_fatal_error函数会导致应用进程直接终止,因此应该谨慎使用,仅在遇到无法恢复的严重错误时才应该调用该函数 605 // 模拟一个致命错误条件 606 bool errorCondition = true; 607 if (errorCondition) { 608 // 创建一个致命错误信息 609 napi_fatal_error("napi_fatal_error test", NAPI_AUTO_LENGTH, "napi_create_error errorMessage", NAPI_AUTO_LENGTH); 610 } 611 return nullptr; 612} 613``` 614<!-- @[napi_fatal_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 615 616接口声明 617 618```ts 619// index.d.ts 620export const fatalError: () => void; 621``` 622<!-- @[napi_fatal_error_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 623 624ArkTS侧示例代码 625 626```ts 627import { hilog } from '@kit.PerformanceAnalysisKit'; 628import testNapi from 'libentry.so'; 629try { 630 testNapi.fatalError(); 631} catch (error) { 632 hilog.error(0x0000, 'testTag', 'Test Node-API napi_fatal_error error'); 633} 634``` 635<!-- @[ark_napi_fatal_error](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 636 637### napi_fatal_exception 638在主线程的上下文环境中调用napi_fatal_exception函数后,抛出一个致命异常,导致应用程序终止,同时会生成相应的crash日志。因此应该慎重使用,避免在正常操作中频繁调用该函数。 639 640cpp部分代码 641 642```cpp 643#include "napi/native_api.h" 644 645static napi_value FatalException(napi_env env, napi_callback_info info) 646{ 647 size_t argc = 1; 648 napi_value args[1] = {nullptr}; 649 650 napi_status status = napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); 651 if (status != napi_ok) { 652 return nullptr; 653 } 654 // 请注意,使用napi_fatal_exception函数会导致应用进程直接终止,因此应该谨慎使用,仅在主线程遇到无法恢复的严重错误时才应该调用该函数 655 // 模拟一个致命错误条件 656 status = napi_fatal_exception(env, args[0]); 657 if (status != napi_ok) { 658 return nullptr; 659 } 660 return nullptr; 661} 662``` 663<!-- @[napi_fatal_exception](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/napi_init.cpp) --> 664 665接口声明 666 667```ts 668// index.d.ts 669export const fatalException: (err: Error) => void; 670``` 671<!-- @[napi_fatal_exception_api](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/cpp/types/libentry/Index.d.ts) --> 672 673ArkTS侧示例代码 674 675```ts 676import { hilog } from '@kit.PerformanceAnalysisKit'; 677import testNapi from 'libentry.so'; 678 679const err = new Error("a fatal exception occurred"); 680testNapi.fatalException(err); 681``` 682<!-- @[ark_napi_fatal_exception](https://gitcode.com/openharmony/applications_app_samples/blob/master/code/DocsSample/ArkTS/NodeAPI/NodeAPIUse/NodeAPIError/entry/src/main/ets/pages/Index.ets) --> 683 684以上代码如果要在native cpp中打印日志,需在CMakeLists.txt文件中添加以下配置信息(并添加头文件:#include "hilog/log.h"): 685 686```text 687// CMakeLists.txt 688add_definitions( "-DLOG_DOMAIN=0xd0d0" ) 689add_definitions( "-DLOG_TAG=\"testTag\"" ) 690target_link_libraries(entry PUBLIC libace_napi.z.so libhilog_ndk.z.so) 691```