rtc sdk 的自定义错误码开发规范

rtc sdk 自定义错误码开发规范:像老司机一样写代码

前几天有个朋友问我,他们团队在对接 rtc sdk 的时候,被各种错误码折腾得够呛。他说每次线上出问题,光是看错误码就要耗半天,更别说定位问题了。这让我意识到,很多团队在使用 RTC SDK 时,往往只关注功能实现,却忽略了错误码设计这个"小事"。

但我要说,错误码设计这件小事,实际上关乎整个项目的可维护性。今天咱们就来聊聊 RTC SDK 自定义错误码的开发规范,我尽量用大白话讲清楚,不搞那些云里雾里的概念。

一、先搞明白:为什么要自定义错误码?

你可能会说,RTC SDK 本身不是有现成的错误码吗?为什么还要自己定义?这问题问得好。

RTC SDK 原生的错误码主要是针对底层通信层面的问题,比如网络连接失败、媒体流建立超时这类基础问题。但实际业务中,很多问题是发生在业务层的。比如用户被封禁了、房间人数已达上限、 VIP 服务到期了——这些业务场景,原生的错误码可管不了。

举个子,你在做一个1V1社交应用,用户充了 VIP 但因为特殊原因无法享受服务,这时候你需要一个明确的错误提示告诉用户"您的高级服务已过期,请续费后再试"。如果只用原生的错误码,你只能告诉用户"连接失败",这让用户一脸懵。

所以自定义错误码的本质,是让业务问题和用户之间架起一座清晰的沟通桥梁。

二、自定义错误码的分类哲学

说到错误码分类,我见过不少团队的设计,那叫一个"随意"。有的是按数字顺序随便排,有的干脆用中文描述当错误码。这两种做法,短期内可能没事,等维护个一两年,保管你后悔莫及。

我建议采用分段式分类法,简单说就是给错误码划定几个"势力范围"。以下是一个经过实战检验的分类框架:

集成导致的问题
错误码范围 分类用途 说明
0 成功状态 一切正常的情况
1 - 999 基础错误码 SDK 预留或通用错误
1000 - 1999 业务权限类 用户权限、角色权限等问题
2000 - 2999 业务逻辑类 房间状态、参数校验等问题
3000 - 3999 资源类错误 配额限制、资源不足等问题
4000 - 4999 第三方服务类
5000 以上 自定义扩展 业务自行扩展使用

这个分类方式有几个好处。首先是一目了然,看到错误码数字,你大概就能猜到是哪类问题。其次是扩展性强,预留了足够的空间给你慢慢加。最后是冲突概率低,因为 SDK 原生错误码和你的自定义错误码在数字上不会打架。

举个实际的例子,你做一个秀场直播应用,假设用户被管理员禁言了,错误码可以设计成 1001,提示语写成"您已被管理员禁言,无法发送消息"。再做秀场 PK 场景,如果对方已经开始了 PK 无法再接受挑战,错误码可以设计成 2003,提示语是"对方正在进行 PK,无法接受新的挑战"。

这种设计方式最大的好处是,出了问题你不用猜,看错误码数字就知道大概是哪个模块的问题。

三、错误码设计的几个"坑"

在分享了几个朋友的代码后,我发现有几个坑几乎是必踩的。我来说说,你对照着检查一下自己的项目。

第一个坑:零散的数字,无规律可循

很多团队早期的错误码是这么加的:1001 是房间满,1002 是用户被禁言,1003 是麦克风故障,1004 是美颜初始化失败……

这种做法在当时可能觉得挺省事,但问题会随着项目变大而显现。当你需要加新错误码时,你会陷入"下一個数字是多少"的沉思,而且当你看到 3005 这个错误码时,你完全不知道它代表什么含义,必须去查文档或者代码。

我的建议是:给错误码加前缀,用模块缩写来区分。比如权限相关用 PERM_,房间相关用 ROOM_,资源相关用 RES_。虽然实际存储可能还是数字,但你在文档和注释里用这种语义化的方式,代码可读性会提升很多。

第二个坑:错误信息写得太"技术"

这个坑我踩过,也见过无数人踩。错误信息写成"ERR_ROOM_NOT_FOUND"或者"User permission denied",对外展示给用户看,用户根本不知道什么意思。

记住,错误信息是给人看的,不是给机器看的。如果你的错误信息要展示给普通用户,请用人类能理解的语言。如果是给开发者看的技术日志,那可以保留技术化的描述。

举个对比:"房间不存在"对比"ERR_ROOM_NOT_FOUND",显然是前者更友好。或者"您的账号已被封禁,请联系客服处理"对比"User is banned",前者明确告诉用户下一步该怎么做。

第三个坑:没有错误码文档,或者文档不更新

这个太常见了。团队里有份错误码文档,上次更新可能是两年前,现在新增了几十个错误码,但文档里根本没有。

我建议的做法是,错误码信息和代码放在一起。可以用枚举类或者常量定义的方式来写,每个错误码都带着说明。比如在 Java 里可以用注释标明含义,在 Swift 里可以用枚举的 case 附带文档注释。

这样做的好处是,改代码的时候你大概率会顺便更新注释,而单独的文档很容易被遗忘。

第四个坑:HTTP 状态码和业务错误码混用

有些团队为了省事,直接把 HTTP 状态码当业务错误码用。比如 403 表示"没有权限",但这个 403 到底是用户被禁了还是 VIP 过期了,根本区分不开。

虽然这样短期内能跑通,但长期来看是给自己挖坑。HTTP 状态码有它特定的语义,应该回归它的本职工作——表示 HTTP 层面的问题。业务层面的错误,应该用独立定义的业务错误码。

四、让错误码"活"起来的实践建议

说完坑,咱们来点实操的。我整理了几个能让错误码更好用的实践建议。

建立错误码的层级关系

有些错误是包含关系,比如"没有权限"可能是因为"账号被封禁",也可能是因为"不是房间管理员"。这时候你可以设计成父错误码和子错误码的形式。

比如权限相关的父错误码是 10xx 段,其中 1001 是"没有操作权限",而 1002 是"账号状态异常"(这是 1001 的子情况),1003 是"房间角色限制"(这也是 1001 的子情况)。

这样设计的好处是,你可以捕获父错误码统一处理,也可以精确捕获子错误码做特殊处理,灵活度很高。

错误码和错误处理逻辑分离

我见过不少代码,错误码和处理逻辑写在一起,比如 if (errCode == 1001) { doSomething() }。这种写法的问题在于,一旦错误码变了,你得满世界找这些判断语句。

更好的做法是建立一个错误码到处理函数的映射表,或者使用策略模式。每种错误码对应一种处理策略,新增错误码只需要加一行映射,修改处理逻辑不影响错误码定义。

给错误码加上"严重程度"

不是所有错误都同等重要。有些错误需要立刻报警,有些只需要记录日志,还有些可以静默忽略。

你可以在错误码系统里加入严重程度的定义,比如分为 INFO(信息)、WARNING(警告)、ERROR(错误)、CRITICAL(严重)四个级别。不同级别的错误,你可以配置不同的处理策略,重要的错误走报警通道,不重要的错误默默记录就行。

考虑多语言支持

如果你的应用要出海,多语言是必须考虑的。错误信息最好别直接写死在中文字符串里,而是用资源 ID 的方式管理。比如"房间人数已满"对应资源 ID 是 ERR_ROOM_FULL_EN、ERR_ROOM_FULL_JP 这样。

虽然前期准备工作多一点,但后续维护和出海的时候会省心很多。

五、结合声网 SDK 的最佳实践

前面说了这么多理论,咱们结合实际场景聊聊。我以声网的 RTC SDK 为例,说说怎么在它的基础上设计业务错误码。

声网的 RTC SDK 本身有一整套错误码体系,主要是处理底层音视频通信的问题,比如网络质量差、设备不支持等。当你基于声网 sdk 开发上层业务时,需要明确区分哪些是声网 SDK 的错误,哪些是你业务层的错误

具体怎么做呢?可以在错误回调里先判断是否是声网 SDK 的错误(通常 SDK 自己的错误码在某个特定范围内),如果是,就按 SDK 的文档处理。如果不是,那就是你的业务错误,需要你自己的错误码体系来处理。

举个例子,你在做 1V1 社交场景。用户发起通话时,可能遇到几种情况:声网 SDK 返回网络不可用(这是 SDK 层面的问题),用户 VIP 已过期(这是业务层面的问题),或者对方正在通话中(这也是业务层面的问题)。

对于业务层面的问题,你就可以用前面说的 2000-2999 段的错误码来定义。比如 VIP 过期可以用 2001,对方忙碌可以用 2002。处理的时候,你对不同错误码做不同的提示,用户体验就很清晰了。

再比如秀场直播场景,假设你用声网的实时音视频能力做主播连麦。当用户要申请连麦时,可能遇到主播设置了连麦人数上限(业务错误,需要提示用户"连麦人数已达上限"),或者主播已经开启了 PK 无法连麦(业务错误,提示"主播正在 PK 中")。这些都用自定义错误码来处理,用户就能明白到底怎么回事。

六、错误码文档的正确姿势

前面提到错误码文档很重要,那文档应该怎么写呢?我建议包含以下几个字段:

  • 错误码:数字编号
  • 错误名称:简短的技术名称,比如 ERR_ROOM_FULL
  • 错误描述:详细说明这个错误是什么意思
  • 触发场景:在什么情况下会触发这个错误
  • 解决方案:开发者看到这个错误应该怎么处理
  • 用户提示:如果需要展示给用户,应该怎么措辞

有了这份文档,开发者定位问题的速度会快很多。而且我建议把这份文档放在团队都能访问到的地方,比如内部 Wiki,并且指定一个人定期维护,避免文档过期。

写在最后

唠了这么多,其实核心思想就一个:错误码不是小事,它是你和应用用户之间的对话窗口。一个好的错误码系统,能让用户清楚知道发生了什么,也能让开发者快速定位问题。

设计错误码的时候,多站在用户的角度想想,多站在后来维护你代码的同事角度想想。有些功夫是省不得的,前期多花点时间把错误码体系搭建好,后期能少踩很多坑。

如果你正在使用声网的 RTC SDK,记得区分好 SDK 层面的错误和业务层面的错误,用不同的体系来处理。这样既不会和 SDK 的错误码冲突,也能让自己的业务逻辑更清晰。

好了,关于 RTC SDK 自定义错误码的开发规范,就聊到这里。如果你有什么想法或者实践经验,欢迎在评论区交流。

上一篇rtc 源码的代码质量检测工具及使用
下一篇 webrtc 的移动端电量消耗测试方法

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱:

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部