跳到主要内容

错误处理

失败时 JNI 调 darra_last_error,再 AiException.throwByCode。hint 原文透传,不改写。getCode() / getMessage() / getHint() 分别对应 C 的 code / message / hint。未知码抛基类,不丢信息。code == 0 为 no-op。

公开 SDK 是 runtime 构建:密码 / 授权相关错误码描述的是「消费已签发容器」失败,不是公开包能签发。

逐码含义与 hint 文案见 错误码目录

错误类型

类型来源处理方式
AiException 子类每个 darra_error_code(除 OK)catch 对应嵌套子类;getHint() 原样展示给最终用户
未知新码未来 Core 追加的码抛基类 AiException,getCode() 原样保留
参数契约违反空路径 / 空 imageBytes / 空 desc / 裸缓冲宽高 ≤ 0 / 会话已关闭AiException.InternalException,message 指明哪个参数
加载 / ABInatives 缺失或 major ≠ 1UnsatisfiedLinkError / UnsupportedPlatformException,禁止继续调用

捕获

try {
try (AiSession s = AiSession.open("model.darmodel", "model.darmkey", null, null)) {
String json = s.inferImage(image, ImageDesc.auto());
}
} catch (AiException.CancelledException ex) {
// 半成品已清理,需要时重新 ensure / open 即可
} catch (AiException ex) {
System.err.println("[" + ex.getCode() + "] " + ex.getMessage());
System.err.println("建议: " + ex.getHint());
}

AiExceptionRuntimeException,不必在方法签名声明。hint 与 error-catalog 逐字一致,绑定不改写,可原样展示给最终用户。

功能概览

类别属性类型访问说明
基类AiException.getCodeint只读darra_error_code 整数值
AiException.getMessageString只读C 的 message(什么错)
AiException.getHintString只读修复建议(error-catalog 标准文案,可为空串)
AiException.throwByCodevoid静态JNI 失败路径入口:按码抛对应子类。code==0 为 no-op。未知码抛基类
IO / 容器IoNotFoundExceptionAiException抛出DARRA_IO_NOT_FOUND (1):文件不存在(容器/授权/图片/离线包路径错)
IoDeniedExceptionAiException抛出DARRA_IO_DENIED (2):文件存在但读/写被拒
BadContainerExceptionAiException抛出DARRA_BAD_CONTAINER (3):.darmodel 损坏 / 非 DARM1 / 被截断篡改
BadLicenseExceptionAiException抛出DARRA_BAD_LICENSE (4):.darmkey 损坏或与容器不配对
授权PasswordRequiredExceptionAiException抛出DARRA_PASSWORD_REQUIRED (5):该容器需要密码但调用方没给
PasswordWrongExceptionAiException抛出DARRA_PASSWORD_WRONG (6):密码错误
MachineMismatchExceptionAiException抛出DARRA_MACHINE_MISMATCH (7):绑机授权在非目标机器上使用
TrialExhaustedExceptionAiException抛出DARRA_TRIAL_EXHAUSTED (8):试用计次已用完
环境UnsupportedPayloadExceptionAiException抛出DARRA_UNSUPPORTED_PAYLOAD (9):载荷类型在当前平台/Provider 下不支持。Windows 收到 rknn 载荷走此码。.pt / .pth 走此码
UnsupportedPlatformExceptionAiException抛出DARRA_UNSUPPORTED_PLATFORM (10):整个 OS/架构不在支持矩阵。Windows 上指名 edge-rknn 走此码
ProviderMissingExceptionAiException抛出DARRA_PROVIDER_MISSING (11):需要的运行时 Provider 包未安装
ProviderAbiMismatchExceptionAiException抛出DARRA_PROVIDER_ABI_MISMATCH (12):Provider 包与内核 ABI 不匹配
HardwareMissingExceptionAiException抛出DARRA_HARDWARE_MISSING (13):未探测到所需硬件
DriverTooOldExceptionAiException抛出DARRA_DRIVER_TOO_OLD (14):驱动版本低于 Provider 包要求(SDK 不代装)
安装 / 内部NetworkFailedExceptionAiException抛出DARRA_NETWORK_FAILED (15):清单 / 运行时包下载失败
ChecksumMismatchExceptionAiException抛出DARRA_CHECKSUM_MISMATCH (16):下载包或离线包 sha256 校验不过
CancelledExceptionAiException抛出DARRA_CANCELLED (17):操作被取消(AiRuntime.ensureCancel)
InternalExceptionAiException抛出DARRA_INTERNAL (18):SDK 内部错误;也用于调用方参数契约违反

方法

getCode()

public int getCode()

darra_error_code 整数值。

返回值:

  • int — 错误码

getHint()

public String getHint()

修复建议,与 error-catalog 的 hint 文案逐字一致。无建议时为空串。绑定不改写。

返回值:

  • String — hint

AiException.throwByCode(int code, String message, String hint)

public static void throwByCode(int code, String message, String hint)

JNI 失败路径入口:按码抛出对应子类。code==0 为 no-op。未知码抛基类,不丢信息。

参数:

  • code (int) — darra_error_code 整值
  • message (String) — C 的 message
  • hint (String) — C 的 hint

码对照

C 常量Java 异常常量
0DARRA_OK(不抛)AiException.OK
1DARRA_IO_NOT_FOUNDAiException.IoNotFoundExceptionIO_NOT_FOUND
2DARRA_IO_DENIEDAiException.IoDeniedExceptionIO_DENIED
3DARRA_BAD_CONTAINERAiException.BadContainerExceptionBAD_CONTAINER
4DARRA_BAD_LICENSEAiException.BadLicenseExceptionBAD_LICENSE
5DARRA_PASSWORD_REQUIREDAiException.PasswordRequiredExceptionPASSWORD_REQUIRED
6DARRA_PASSWORD_WRONGAiException.PasswordWrongExceptionPASSWORD_WRONG
7DARRA_MACHINE_MISMATCHAiException.MachineMismatchExceptionMACHINE_MISMATCH
8DARRA_TRIAL_EXHAUSTEDAiException.TrialExhaustedExceptionTRIAL_EXHAUSTED
9DARRA_UNSUPPORTED_PAYLOADAiException.UnsupportedPayloadExceptionUNSUPPORTED_PAYLOAD
10DARRA_UNSUPPORTED_PLATFORMAiException.UnsupportedPlatformExceptionUNSUPPORTED_PLATFORM
11DARRA_PROVIDER_MISSINGAiException.ProviderMissingExceptionPROVIDER_MISSING
12DARRA_PROVIDER_ABI_MISMATCHAiException.ProviderAbiMismatchExceptionPROVIDER_ABI_MISMATCH
13DARRA_HARDWARE_MISSINGAiException.HardwareMissingExceptionHARDWARE_MISSING
14DARRA_DRIVER_TOO_OLDAiException.DriverTooOldExceptionDRIVER_TOO_OLD
15DARRA_NETWORK_FAILEDAiException.NetworkFailedExceptionNETWORK_FAILED
16DARRA_CHECKSUM_MISMATCHAiException.ChecksumMismatchExceptionCHECKSUM_MISMATCH
17DARRA_CANCELLEDAiException.CancelledExceptionCANCELLED
18DARRA_INTERNALAiException.InternalExceptionINTERNAL

子类全部是 AiExceptionpublic static final class 嵌套类,包名 xyz.darra.ai

常见场景

明文 .onnx 传给 AiSession.openBadContainerException。明文请改用 openPlain

Windows 无 RKNN:

  • 指名 edge-rknnUnsupportedPlatformException
  • 容器 / 明文是 rknn 载荷 → UnsupportedPayloadException

RKNN 只在 linux-arm64。不要在 Windows 上试降级,SDK 不静默换 Provider。

.pt / .pthUnsupportedPayloadException。Paddle 是运行时载荷,明文 openPlain.pdmodel(伴生 .pdiparams),不走这条拒绝路径。

进度回调里调 ensureCancel 视为违反契约。取消必须从回调外的线程(含 UI 线程)调。

close 后再 inferImage / metaJsonInternalException(「会话已关闭」)。