---
title: aclrtSetExceptionInfoCallback
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/runtimeapi/aclcppdevg_03_0134.html
sourcePath: /source/zh/canncommercial/900/API/runtimeapi/aclcppdevg_03_0134.html
indexId: f35f7b4d4bad2aada48594f8fa4de9a99afe367b19baca3a69314aa2f15708ec68
---
# aclrtSetExceptionInfoCallback

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | √ |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ |
| Atlas 200I/500 A2 推理产品 | √ |
| Atlas 推理系列产品 | √ |
| Atlas 训练系列产品 | √ |


#### 功能说明

设置异常回调函数。若多次设置异常回调函数，以最后一次设置为准。


#### 函数原型

```
aclError aclrtSetExceptionInfoCallback(aclrtExceptionInfoCallback callback)
```


#### 参数说明

| 参数名 | 输入/输出 | 说明 |
| --- | --- | --- |
| callback | 输入 | 指定要注册的回调函数。 回调函数的函数原型为： typedef void (\*aclrtExceptionInfoCallback)(aclrtExceptionInfo \*exceptionInfo); |


#### 返回值说明

返回0表示成功，返回其他值表示失败，请参见aclError。


#### 约束说明

- 回调函数涉及共享资源（例如锁），因此在使用回调函数需慎重，在回调函数内调用资源申请&释放、Stream同步、Device同步、任务下发、任务终止等接口，可能会导致错误或死锁。
- 您需要在执行异步任务之前，设置异常回调函数，当Device上的任务执行异常时，系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo结构体指针，并执行回调函数，用户可以再分别调用  aclrtGetTaskIdFromExceptionInfo
、  aclrtGetStreamIdFromExceptionInfo
、  aclrtGetThreadIdFromExceptionInfo
、  aclrtGetDeviceIdFromExceptionInfo
、  aclrtGetErrorCodeFromExceptionInfo
接口获取产生异常的任务ID、Stream ID、线程ID、Device ID以及错误码，便于定位问题。
  使用场景举例：例如，在调用aclopExecuteV2(https://www.hiascend.comdocument/detail/zh/canncommercial/900/API/ascendgraphapi/aclcppdevg_03_0250.html)接口前，调用aclrtSetExceptionInfoCallback接口设置异常回调函数，当算子在Device执行异常时，系统会向用户设置的异常回调函数中传入一个包含任务ID、Stream ID、线程ID、Device ID以及错误码的aclrtExceptionInfo结构体指针，并执行回调函数。

- 如果想清空回调函数，可调用aclrtSetExceptionInfoCallback接口，将入参设置为空指针。


#### 接口调用流程

使用场景举例：执行整网模型推理时（不支持动态Shape场景），如果产生AI Core报错，可以按照本章的内容获取报错算子的描述信息，再做进一步错误排查。

推荐的接口调用顺序如下：1. 定义并实现异常回调函数fn(aclrtExceptionInfoCallback类型)。
实现回调函数的关键逻辑如下：

  a. 在异常回调函数fn内调用aclrtGetDeviceIdFromExceptionInfo、aclrtGetStreamIdFromExceptionInfo、aclrtGetTaskIdFromExceptionInfo接口分别获取Device ID、Stream ID、Task ID。
  b. 在异常回调函数fn内调用aclmdlCreateAndGetOpDesc接口获取算子的描述信息。
  c. 在异常回调函数fn内调用aclGetTensorDescByIndex接口获取指定算子输入/输出的tensor描述。
  d. 在异常回调函数fn内调用如下接口获取tensor描述中的数据，进行进一步分析。
    例如，调用aclGetTensorDescAddress接口获取tensor数据的内存地址（用户可从该内存地址中获取tensor数据）、调用aclGetTensorDescType接口获取tensor描述中的数据类型、调用aclGetTensorDescFormat接口获取tensor描述中的Format、调用aclGetTensorDescNumDims接口获取tensor描述中的Shape维度个数、调用aclGetTensorDescDimV2接口获取Shape中指定维度的大小。

2. 调用aclrtSetExceptionInfoCallback接口设置异常回调函数。
3. 执行模型推理。
  如果存在AI Core报错，则触发回调函数fn，获取算子的信息，进行进一步分析。


#### 示例代码

以下是AI Core异常信息获取功能的关键步骤代码示例，不能直接拷贝编译运行，仅供参考。调用接口后，需增加异常处理的分支，并记录报错日志、提示日志，此处不一一列举。```
......

// 1.模型加载，加载成功后，返回标识模型的modelId

// 2.创建aclmdlDataset类型的数据，用于描述模型的输入数据input、输出数据output

// 3.实现异常回调函数
void callback(aclrtExceptionInfo *exceptionInfo)
{
    deviceId = aclrtGetDeviceIdFromExceptionInfo(exceptionInfo);
    streamId = aclrtGetStreamIdFromExceptionInfo(exceptionInfo);
    taskId = aclrtGetTaskIdFromExceptionInfo(exceptionInfo);
    
    char opName[256];
    aclTensorDesc *inputDesc = nullptr;
    aclTensorDesc *outputDesc = nullptr;
    size_t inputCnt = 0;
    size_t outputCnt = 0; 
    // 用户可以将获取的算子信息写入到文件，或者另起线程，当发生异常回调时触发线程处理函数，在线程处理函数中将算子信息在屏幕上显示 
    aclmdlCreateAndGetOpDesc(deviceId, streamId, taskId, opName, 256,  &inputDesc, &inputCnt, &outputDesc, &outputCnt);
    // 可以调用tensor的相关接口，获取算子的相关信息，用户可以根据自己需要调用
    for (size_t i = 0; i < inputCnt; ++i) {
        const aclTensorDesc *desc = aclGetTensorDescByIndex(inputDesc, i);
        aclGetTensorDescAddress(desc);
        aclGetTensorDescFormat(desc);
    }
    for (size_t i = 0; i < outputCnt; ++i) {
        const aclTensorDesc *desc = aclGetTensorDescByIndex(outputDesc, i);
        aclGetTensorDescAddress(desc);
        aclGetTensorDescFormat(desc);
    }
    aclDestroyTensorDesc(inputDesc);
    aclDestroyTensorDesc(outputDesc);
}

// 4.设置异常回调
aclrtSetExceptionInfoCallback(callback);

// 5.执行模型
aclmdlExecute(modelId, input, output);

// 6.处理模型推理结果
......

// 7.释放描述模型输入/输出信息、内存等资源，卸载模型
......
```
