错误
C ABI 用 int32_t 错误码 + 线程局部错误槽。不抛异常,没有 DarraException。函数仍是 C ABI。hint 文案与 错误码 逐字相同,不得改写。
提示
- 每个 API 进入时先清空本线程槽,失败时填满,成功后保持空。
- 一次失败之后、同一线程下一次 API 之前,
darra_last_error取到的就是这次失败的细节。 - 公开 runtime 描述的是「消费已签发容器」失败,不是公开包能签发。
功能概览
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 错误槽 | darra_last_error | int32_t | 查询 | 取本线程最近一次失败细节;out 可为 nullptr |
darra_clear_error | void | 过程 | 显式清空本线程错误槽 | |
| 类型 | darra_error_code | enum | 只读 | 0 = 成功;1..18 见下方 |
darra_error_t | struct | 出参 | size + code + message[256] + hint[512] |
错误码
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 成功 | DARRA_OK | 0 | 只读 | 成功 |
| 输入 / 授权 | DARRA_IO_NOT_FOUND | 1 | 只读 | 文件不存在(容器 / 授权 / 图片 / 离线包路径错) |
DARRA_IO_DENIED | 2 | 只读 | 文件存在但读 / 写被拒 | |
DARRA_BAD_CONTAINER | 3 | 只读 | .darmodel 损坏 / 非 DARM1 / 被截断篡改 | |
DARRA_BAD_LICENSE | 4 | 只读 | .darmkey 损坏或与容器不配对 | |
DARRA_PASSWORD_REQUIRED | 5 | 只读 | 该容器需要密码但调用方没给 | |
DARRA_PASSWORD_WRONG | 6 | 只读 | 密码错误。官方不解回明文 | |
DARRA_MACHINE_MISMATCH | 7 | 只读 | 绑机授权在非目标机器上使用 | |
DARRA_TRIAL_EXHAUSTED | 8 | 只读 | 试用计次已用完 | |
| 平台 / 环境 | DARRA_UNSUPPORTED_PAYLOAD | 9 | 只读 | 载荷类型在当前平台 / Provider 下不支持。Windows 收到 rknn 载荷即此码 |
DARRA_UNSUPPORTED_PLATFORM | 10 | 只读 | 整个 OS / 架构不在支持矩阵。Windows 上指名 edge-rknn 即此码 | |
DARRA_PROVIDER_MISSING | 11 | 只读 | 需要的运行时 Provider 包未安装 | |
DARRA_PROVIDER_ABI_MISMATCH | 12 | 只读 | Provider 包与 Core 的 ABI 版本不匹配 | |
DARRA_HARDWARE_MISSING | 13 | 只读 | 未探测到所需硬件(N 卡 / Intel / RK3588 NPU) | |
DARRA_DRIVER_TOO_OLD | 14 | 只读 | 驱动版本低于 Provider 要求(SDK 不代装) | |
| 网络 / 其它 | DARRA_NETWORK_FAILED | 15 | 只读 | 清单 / 运行时包下载失败 |
DARRA_CHECKSUM_MISMATCH | 16 | 只读 | 下载包或离线包 sha256 校验不过 | |
DARRA_CANCELLED | 17 | 只读 | 操作被取消(darra_runtime_ensure_cancel) | |
DARRA_INTERNAL | 18 | 只读 | SDK 内部错误;也用于调用方参数契约违反 |
参数契约违反(nullptr 句柄 / nullptr 出参 / size 未填 / 裸缓冲缺宽高 / len 不足)属调用方 bug:返回 DARRA_INTERNAL,message 指明哪个参数。SDK 在任何非法入参下都不崩溃。逐码 hint 与用户下一步见 错误码。
错误槽
darra_last_error()
int32_t darra_last_error(darra_error_t* out);
取本线程最近一次失败的细节。out 可为 nullptr(只查码);非 nullptr 时调用方先填 out->size = sizeof(*out)。无错误(或上次调用成功)返回 DARRA_OK。message / hint 为定长数组,SDK 保证 NUL 结尾,调用方无需释放。
参数:
out(darra_error_t*) — 出参;nullptr= 只查码不管细节
返回值:
int32_t— 本线程错误槽里的码;无错误返回DARRA_OK
相关结构:
typedef struct darra_error_t {
uint32_t size; // 调用方填 sizeof(darra_error_t)
int32_t code; // darra_error_code
char message[256]; // 错误描述(UTF-8,保证 NUL 结尾)
char hint[512]; // 修复建议(UTF-8,可为空串)
} darra_error_t;
示例:
int32_t rc = darra_session_open(...);
if (rc != DARRA_OK) {
darra_error_t err{};
err.size = sizeof(err);
darra_last_error(&err);
std::fprintf(stderr, "[%d] %s\n建议: %s\n", err.code, err.message, err.hint);
}
darra_clear_error()
void darra_clear_error(void);
显式清空本线程错误槽。一般不需要手动调(每次 API 进入自动清),供绑定层在特殊时序下使用。
示例:
darra_clear_error();
完整示例
#include "darra_ai.h"
#include <cstdio>
static int fail(const char* where, int32_t rc) {
darra_error_t err{};
err.size = sizeof(err);
if (darra_last_error(&err) == DARRA_OK) {
std::fprintf(stderr, "%s 失败 rc=%d(无错误细节)\n", where, rc);
} else {
std::fprintf(stderr, "%s 失败 [%d] %s\n建议: %s\n",
where, err.code, err.message, err.hint);
}
return static_cast<int>(rc);
}
int main() {
darra_session* s = nullptr;
int32_t rc = darra_session_open("model.darmodel", "model.darmkey",
nullptr, nullptr, &s);
if (rc != DARRA_OK) return fail("darra_session_open", rc);
darra_session_close(s);
return 0;
}