• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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], &dividend);
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```