跳到主要内容

错误

C ABI 用 int32_t 错误码 + 线程局部错误槽。不抛异常,没有 DarraException。函数仍是 C ABI。hint 文案与 错误码 逐字相同,不得改写。

提示
  • 每个 API 进入时先清空本线程槽,失败时填满,成功后保持空。
  • 一次失败之后、同一线程下一次 API 之前,darra_last_error 取到的就是这次失败的细节。
  • 公开 runtime 描述的是「消费已签发容器」失败,不是公开包能签发。

功能概览

类别属性类型访问说明
错误槽darra_last_errorint32_t查询取本线程最近一次失败细节;out 可为 nullptr
darra_clear_errorvoid过程显式清空本线程错误槽
类型darra_error_codeenum只读0 = 成功;1..18 见下方
darra_error_tstruct出参size + code + message[256] + hint[512]

错误码

类别属性类型访问说明
成功DARRA_OK0只读成功
输入 / 授权DARRA_IO_NOT_FOUND1只读文件不存在(容器 / 授权 / 图片 / 离线包路径错)
DARRA_IO_DENIED2只读文件存在但读 / 写被拒
DARRA_BAD_CONTAINER3只读.darmodel 损坏 / 非 DARM1 / 被截断篡改
DARRA_BAD_LICENSE4只读.darmkey 损坏或与容器不配对
DARRA_PASSWORD_REQUIRED5只读该容器需要密码但调用方没给
DARRA_PASSWORD_WRONG6只读密码错误。官方不解回明文
DARRA_MACHINE_MISMATCH7只读绑机授权在非目标机器上使用
DARRA_TRIAL_EXHAUSTED8只读试用计次已用完
平台 / 环境DARRA_UNSUPPORTED_PAYLOAD9只读载荷类型在当前平台 / Provider 下不支持。Windows 收到 rknn 载荷即此码
DARRA_UNSUPPORTED_PLATFORM10只读整个 OS / 架构不在支持矩阵。Windows 上指名 edge-rknn 即此码
DARRA_PROVIDER_MISSING11只读需要的运行时 Provider 包未安装
DARRA_PROVIDER_ABI_MISMATCH12只读Provider 包与 Core 的 ABI 版本不匹配
DARRA_HARDWARE_MISSING13只读未探测到所需硬件(N 卡 / Intel / RK3588 NPU)
DARRA_DRIVER_TOO_OLD14只读驱动版本低于 Provider 要求(SDK 不代装)
网络 / 其它DARRA_NETWORK_FAILED15只读清单 / 运行时包下载失败
DARRA_CHECKSUM_MISMATCH16只读下载包或离线包 sha256 校验不过
DARRA_CANCELLED17只读操作被取消(darra_runtime_ensure_cancel)
DARRA_INTERNAL18只读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_OKmessage / 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;
}