Appearance
6. 错误码
6.1 先看响应信封
DASS2 的错误不体现在 HTTP 状态码上(业务失败通常仍是 200),而是体现在响应体的 code / msg / data 三个字段:
json
{ "code": <错误码>, "msg": "error", "count": <计数>, "data": <错误文案> }| 字段 | 说明 |
|---|---|
code | 主错误码。0 表示成功 |
msg | 恒为 "ok" 或 "error"。它只是标签,不含具体信息 |
count | 计数,含义随接口变化 |
data | 真正的错误文案在这里。可能是字符串,也可能是对象数组(逐行错误) |
【警告】判定成功必须同时满足
code == 0 && msg == "ok"。 已实测到code:0与msg:"error"并存的响应(见 6.4)。
6.2 code 取值总览
code | 含义 | 出现场景 |
|---|---|---|
0 | 成功(msg="ok") | 绝大多数接口 |
0 | 也可能是失败(msg="error") | 部分接口把错误码误传为 0,如 /v1/das/conf/{不存在的id} |
-1 | 业务失败 | 最常见。错误原因在 data |
1 | 查询无数据 | 部分列表接口(如 /v1/das 查询异常时) |
-2 ~ -3、-10 ~ -11、-96 ~ -117、-200 ~ -202 | 实时库/底层错误码 | 依赖 openPlant 的接口(见 6.3) |
1 ~ 9、100 ~ 111、200 ~ 206、400、410 ~ 412 | 实时库/脚本引擎错误码 | 见 6.3 |
6.3 底层错误码表(consts/errorCode.go)
以下错误码来自 DASS2 内置的 ErrorCode 映射,主要在对实时库(openPlant)的操作中返回,文案取自 conf/locale_zh-CN.ini。
6.3.1 通用与连接类
| code | 文案 |
|---|---|
-1 / -2 / -3 | 未知错误 |
-10 | 参数错误 |
-11 | 功能未支持 |
-96 | 无法分配内存,需要重连 |
-97 | 网络读写IO错误,需要重连 |
-98 | 连接已关闭,需要重连 |
-99 | 无法连接服务器,需要重连 |
-1001 | 网络断开 |
-1002 | 写入存储缓存文件出错了,最有可能是文件所在分区满了 |
-1003 | 数据文件到了预设的大小 |
-100 | 数据包格式 |
-101 | 命令不支持 |
-102 | 对象已存在 |
-103 | 对象不存在 |
-104 | 关键字重复 |
-105 | 创建失败 |
-106 | 系统容量限制 |
-107 | 父节点错误 |
-108 | 写数据库错误 |
-109 | 不容许访问 |
-110 | 名称错误 |
-111 | 需要等待 |
-112 | 不匹配 |
-113 | 参数错误 |
-114 | 过时的 |
-115 | 资源被锁定 |
-116 | 未初始化 |
-117 | 部分错误 |
-200 | 访问历史错误 |
-201 | 不合适的时间间隔 |
-202 | 没有归档 |
6.3.2 操作系统 / 引擎类(正数)
| code | 文案 |
|---|---|
1 | 操作系统底层错误 |
2 | 网络连接错误 |
3 | 参数错误,使用了无效的参数 |
4 | 分配内存错误,分配内存失败 |
5 | 目录使用错误 |
6 | 当前服务未知其命令 |
7 | soci内部错误 |
8 | 文件打开错误 |
9 | 文件内容解析错误 |
100 | 范围越界 |
101 | 栈越界 |
102 | 索引越界 |
103 | 未知指令 |
104 | 未知方法 |
105 | 无效调用,对象不支持这个调用 |
106 | 调用参数错误 |
107 | 未知接口 |
108 | 未知内建模块 |
109 | 虚拟机执行被暂停 |
110 / 111 | 请求执行异步操作 |
200 | TCP 连接时出错 |
201 | TCP 写数据时出错 |
202 | TCP 读数据时出错 |
203 | 收到的包长不合理 |
204 | 在等待连接时出错 |
205 | 非法的MTable字节序列 |
206 | 系统已经停机 |
400 | 解压数据不正确 |
410 | 用户不存在 |
411 / 412 | 密码不匹配 |
6.4 实测错误响应样本
以下均为在真机 2.5.9.20241216 上实测到的原样响应。
| 场景 | HTTP | 响应体 |
|---|---|---|
| 未登录(受保护接口) | 401 | <a href="/">Unauthorized</a>.(HTML,非 JSON) |
未登录调 /v1/isLogin/ | 302 | 重定向到 / |
未登录调 /v1/logout/ | 500 | 空响应(服务端 panic) |
| 密码错误 | 200 | {"code":-1,"count":0,"data":"账号或密码错误","msg":"error"} |
| 用 GET 调登录接口 | 200 | {"code":-1,"count":0,"data":"只允许POST方法","msg":"error"} |
| 停止不存在的服务 | 200 | {"code":-1,"count":1,"data":"服务不存在\u003cQuerySeter\u003e no row found","msg":"error"} |
| 查询不存在的服务配置 | 200 | {"code":0,"count":0,"data":"DAS服务配置错误\u003cQuerySeter\u003e no row found","msg":"error"} ← 注意 code 是 0 |
【警告】右上角最后一行是最危险的一个:
code == 0却是失败。只按code判成败的客户端会把它当成导入/查询成功,进而拿到空的配置继续往下走。
6.5 常见业务文案(conf/locale_zh-CN.ini)
错误文案随 data 返回,中文串来自语言包。以下是二次开发最常撞到的:
6.5.1 登录与鉴权
| 常量名 | 文案 |
|---|---|
ACCOUNT_PASSWORD_EMPTY_MESSAGE | 用户名和密码都不能为空 |
ACCOUNT_PASSWORD_ERROR_MESSAGE | 账号或密码错误 |
ACCOUNT_DISABLED | 该帐号已禁用 |
ACCOUNT_NOT_EXIST | 用户不存在 |
ACCOUNT_LOCKED | 该帐号已被锁定 |
NOT_LOGIN_MESSAGE | 没有登录 |
ONLY_POST_METHOD_ALLOWED | 只允许POST方法 |
LOGOUT_SUCCESS | 注销成功 |
USER_LOGIN_TIMEOUT | 登陆已超时,请重新登陆 |
6.5.2 服务与测点
| 常量名 | 文案 |
|---|---|
ERROR_MESSAGE_DAS_NOT_EXIST | 服务不存在 |
ERROR_MESSAGE_DAS_EXIST | 服务已存在 |
ERROR_MESSAGE_DRIVER_NOT_EXIST | 驱动不存在 |
DAS_NAME_NOT_EMPTY | 服务名不能为空 |
POINT_NAME_NOT_EMPTY | 点名不能为空 |
IMPORT_SUCCESS | 导入成功 |
NULL_DATA_MESSAGE | 没有对应数据 |
INSERT_ERROR_MESSAGE | 插入错误 |
FILE_NULL_DATA_MESSAGE | 空文件 |
DESCRIPTION_CANNOT_BE_EMPTY | 描述信息不能为空 |
TV_NOT_BE_LESS_THAN_BV | 量程上限(TV)不得小于量程下限(BV) |
DATA_POINT_NAME_EXCEEDS_LIMIT | 测点名称超过长度限制 |
SELECT_POINT_SR_FAILED | 获取服务对应的驱动测点类型选项失败 |
Verfication_Validation_RT | 不支持的测点类型: |
6.5.3 点表导入的逐行错误(直接来自源码)
这些文案不走语言包,是硬编码的中文串,会出现在导入响应 data[].Flag 里:
| 文案 | 触发条件 |
|---|---|
ID不能为空 | 表头缺 ID 列且该行没值(手动模式下) |
ID<xxx>重复 | 同一文件内 ID 重复 |
ID<xxx>类型错误 | ID 不是数字 |
ID<xxx>不能小于1024 | ID < 1024 |
PN不能为空 | PN 列为空 |
PN<xxx>长度超过最大值<32> | PN 超长(实测上限 32) |
PN<xxx>格式不对,请检查是否含有非法字符(仅支持数字、大小写字母、特殊字符#:@-_) | PN 含非法字符 |
Event类型错误 | EVENT 或 UM 列非整数 |
DB类型错误 | DB 列不是数字 |
DB不能小于0 | DB 为负 |
xlsx文件转换为point实例失败 | 行解析失败(响应里带 Row:<行号>, Err:<原因>) |
手动添加测点模式时ID列不能为空 | 服务 isLink=false 但该行没填 ID |
非法的测点状态:xxx,期待(Good,Bad,Timeout) | 查询时 DS 传了非法状态名 |
6.6 排错建议
- 先看 HTTP 状态码:
401/302一律是鉴权问题,不要去解析响应体(那是 HTML)。 - 再看
msg:"ok"之外的都算失败,无论code是什么。 - 从
data取原因:data是字符串就直接读;是数组就遍历Flag/PN。 - 注意
\u003c/\u003e:错误文案里嵌入的<>会被 JSON 转义成\u003c\u003e(例如<QuerySeter>),做字符串匹配时要按解码后的内容判断。 - 服务端日志:DASS2 会把每次失败写入
logs/dasserver.log,关键动作(导入、启停、登录)都有中文日志行,排障时可在设备上查看。
帮助中心