Skip to content

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:0msg:"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 ~ 9100 ~ 111200 ~ 206400410 ~ 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当前服务未知其命令
7soci内部错误
8文件打开错误
9文件内容解析错误
100范围越界
101栈越界
102索引越界
103未知指令
104未知方法
105无效调用,对象不支持这个调用
106调用参数错误
107未知接口
108未知内建模块
109虚拟机执行被暂停
110 / 111请求执行异步操作
200TCP 连接时出错
201TCP 写数据时出错
202TCP 读数据时出错
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>不能小于1024ID < 1024
PN不能为空PN 列为空
PN<xxx>长度超过最大值<32>PN 超长(实测上限 32)
PN<xxx>格式不对,请检查是否含有非法字符(仅支持数字、大小写字母、特殊字符#:@-_)PN 含非法字符
Event类型错误EVENTUM 列非整数
DB类型错误DB 列不是数字
DB不能小于0DB 为负
xlsx文件转换为point实例失败行解析失败(响应里带 Row:<行号>, Err:<原因>
手动添加测点模式时ID列不能为空服务 isLink=false 但该行没填 ID
非法的测点状态:xxx,期待(Good,Bad,Timeout)查询时 DS 传了非法状态名

6.6 排错建议

  1. 先看 HTTP 状态码401 / 302 一律是鉴权问题,不要去解析响应体(那是 HTML)。
  2. 再看 msg"ok" 之外的都算失败,无论 code 是什么。
  3. data 取原因data 是字符串就直接读;是数组就遍历 Flag / PN
  4. 注意 \u003c / \u003e:错误文案里嵌入的 < > 会被 JSON 转义成 \u003c \u003e(例如 <QuerySeter>),做字符串匹配时要按解码后的内容判断。
  5. 服务端日志:DASS2 会把每次失败写入 logs/dasserver.log,关键动作(导入、启停、登录)都有中文日志行,排障时可在设备上查看。