errors.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. // Package msg
  2. // 一个错误编号表示唯一一个错误发生地点
  3. // 错误编号格式:顺序号*1000000 + 程序编号*1000 + 模块编号
  4. // 模块内函数发生错误,编号:1-100
  5. // 特定错误,编号:101-200
  6. // 其他地方发生错误,占用地址列表
  7. // 1、
  8. package msg
  9. import "fmt"
  10. // ErrorCode 结构体表示错误编码
  11. type ErrorCode struct {
  12. ProgramID int
  13. ModuleID int
  14. }
  15. const (
  16. ServerTypeLogin = 1
  17. ServerTypeGate = 2
  18. ServerTypeWorld = 3
  19. ServerTypeAll = 999 // 所有服务器
  20. )
  21. const (
  22. GateModleGame = 1
  23. GateModleGate = 2
  24. GateModlePush = 3
  25. WorldModleDb = 1
  26. WorldModleGame = 2
  27. WorldModleGate = 3
  28. WorldModleSystemData = 4
  29. AllModelAll = 999 // 所有模块
  30. )
  31. // 对象类型 1000种
  32. const (
  33. ErrObjectParam = 1
  34. ErrObjectPlayer = 2
  35. ErrObjectConfig = 3
  36. ErrObjectCondition = 4
  37. ErrObjectTarget = 5
  38. ErrObjectItem = 6
  39. ErrObjectResult = 7
  40. ErrObjectHero = 9
  41. ErrObjectTreasures = 10
  42. ErrObjectChapter = 11
  43. ErrObjectReward = 12
  44. ErrObjectStam = 13
  45. ErrObjectSystem = 90
  46. ErrObjectDb = 91
  47. ErrObjectRedis = 92
  48. ErrObjectMax = 999
  49. )
  50. // 每个对象100种状态
  51. // 定义10个常用状态
  52. const (
  53. ErrStatusInvalid = 91 // 无效
  54. ErrStatusNotFound = 92 // 未发现
  55. ErrStatusNotEnough = 93 // 不够
  56. ErrStatusError = 94 // 错误
  57. ErrStatusOverstep = 95 // 超出
  58. )
  59. const (
  60. Multiple100 = 100
  61. // 全局参数 一般不要用,防止出现问题定位不到在所在程序及位置
  62. // 999 999 001 0000 - 999 999 999 9999
  63. ErrPlayerNoToken = 999_999_000_0000 + errPlayerNoToken*100
  64. ErrPlayerBanLogin = 999_999_000_0000 + errPlayerBanLogin*100
  65. ErrPlayerOtherLogin = 999_999_000_0000 + errPlayerOtherLogin*100
  66. ErrSystemUpgrade = 999_999_000_0000 + ErrObjectSystem*10000 + 1*100
  67. ErrSystemFull = 999_999_000_0000 + ErrObjectSystem*10000 + 2*100
  68. ErrSystemFoundCheat = 999_999_000_0000 + ErrObjectSystem*10000 + 3*100
  69. // 请求参数 100
  70. ErrParamInvalid = ErrObjectParam*Multiple100 + ErrStatusInvalid
  71. // 玩家 200
  72. errPlayerBanLogin = ErrObjectPlayer*Multiple100 + 1
  73. errPlayerOtherLogin = ErrObjectPlayer*Multiple100 + 2
  74. ErrPlayerNotFound = ErrObjectPlayer*Multiple100 + ErrStatusNotFound
  75. errPlayerNoToken = ErrObjectPlayer*Multiple100 + 3
  76. // 道具 300
  77. ErrItemNotFound = ErrObjectItem*Multiple100 + ErrStatusNotFound
  78. ErrItemNotEnough = ErrObjectItem*Multiple100 + ErrStatusNotEnough
  79. // 目标
  80. ErrTargetNotFound = ErrObjectTarget*Multiple100 + ErrStatusNotFound
  81. // 配置
  82. ErrConfigNotFound = ErrObjectConfig*Multiple100 + ErrStatusNotFound
  83. ErrConfigError = ErrObjectConfig*Multiple100 + ErrStatusError
  84. // 条件
  85. ErrConditionNotEnough = ErrObjectCondition*Multiple100 + ErrStatusNotEnough
  86. // 结果
  87. ErrResultError = ErrObjectResult*Multiple100 + ErrStatusError
  88. // 英雄 400
  89. ErrHeroNotFound = ErrObjectHero*Multiple100 + ErrStatusNotFound
  90. // 宝物 500
  91. ErrTreasuresNotFound = ErrObjectTreasures*Multiple100 + ErrStatusNotFound
  92. // 数据库 600
  93. ErrDBExec = ErrObjectDb*Multiple100 + 1
  94. ErrDBLoadNil = ErrObjectDb*Multiple100 + 2
  95. // redis 700
  96. ErrRedisExec = ErrObjectRedis*Multiple100 + 1
  97. // 章节
  98. ErrChapterNotFound = ErrObjectChapter*Multiple100 + ErrStatusNotFound
  99. //奖励
  100. ErrRewardNotFound = ErrObjectReward*Multiple100 + ErrStatusNotFound
  101. ErrRewardIsReceived = ErrObjectReward*Multiple100 + 1 // 已领取
  102. //体力
  103. ErrStamOverstep = ErrObjectStam*Multiple100 + ErrStatusOverstep
  104. // 配置
  105. // ErrConfigMaxOnline = ErrObjectConfig*Multiple100 + 1
  106. ErrMaxTypeMaxStatus = ErrObjectMax*100 + 99 // 99900+99 = 999_99
  107. ErrMaxVal = 999*1000_000_0000 + 999*1000_0000 + 999*10000 + 99*100 + 99
  108. )
  109. // 每种状态在同一个函数种可以使用100次,需要序号递增
  110. // initErrorCodes 是一个包级初始化函数,用于设置程序编号和模块编号
  111. // login 1:
  112. // world 2: db:1; game:2; gate:3; systemdata:4
  113. // gate 3:
  114. func InitErrorCodes(programID, moduleID int) *ErrorCode {
  115. errorCodes := new(ErrorCode)
  116. errorCodes.ProgramID = programID
  117. errorCodes.ModuleID = moduleID
  118. return errorCodes
  119. }
  120. // GenerateErrorCode 生成错误编号,只需要提供顺序号
  121. func (ec *ErrorCode) GenerateErrorCode(errObj int, errStatus int, seq int) int {
  122. return ec.ProgramID*1000_000_0000 + ec.ModuleID*1000_0000 + errObj*10000 + errStatus*100 + seq
  123. }
  124. // 支持输入格式
  125. // ojbstatus
  126. // objstatus,seq
  127. //obj,status,seq
  128. // promodelobjstatusseq
  129. // promodelobjstatusseq,seq
  130. func (ec *ErrorCode) CalcErrorCode(objStatusSeq ...int) int {
  131. num := len(objStatusSeq)
  132. switch num {
  133. case 0:
  134. return 0
  135. case 1:
  136. // objstatus
  137. // promodelobjstatusseq
  138. if objStatusSeq[0] > ErrObjectMax*10000 {
  139. return objStatusSeq[0]
  140. }
  141. return ec.GenerateErrorCode(objStatusSeq[0]/100, (objStatusSeq[0] % 100), 0)
  142. case 2:
  143. // objstatus,seq
  144. // promodelobjstatusseq,seq
  145. if objStatusSeq[0] > ErrObjectMax*10000 {
  146. return objStatusSeq[0] + objStatusSeq[1]
  147. }
  148. return ec.GenerateErrorCode(objStatusSeq[0]/100, (objStatusSeq[0] % 100), objStatusSeq[1])
  149. case 3:
  150. return ec.GenerateErrorCode(objStatusSeq[0], objStatusSeq[1], objStatusSeq[2])
  151. default:
  152. return 0
  153. }
  154. }
  155. func (ec *ErrorCode) PrintError(errCode int, errMsg string) {
  156. errCode2 := ec.CalcErrorCode(errCode)
  157. // code := (errCode2 % 1000_0000) / 100
  158. // fmt.Printf("%v-%v: %v %s\n", errCode2, errCode2+99, code, errMsg)
  159. fmt.Printf("%v: %s\n", errCode2, errMsg)
  160. }
  161. func PrintErrorCode() {
  162. errorEncoder1 := InitErrorCodes(ServerTypeGate, GateModleGame)
  163. errorEncoder1.PrintError(ErrParamInvalid, "参数错误")
  164. errorEncoder1.PrintError(ErrPlayerBanLogin, "禁止登录")
  165. errorEncoder1.PrintError(ErrPlayerOtherLogin, "异地登录")
  166. errorEncoder1.PrintError(ErrPlayerNotFound, "玩家未登录")
  167. errorEncoder1.PrintError(ErrPlayerNoToken, "玩家凭证不存在")
  168. errorEncoder2 := InitErrorCodes(ServerTypeWorld, WorldModleGame)
  169. errorEncoder2.PrintError(ErrItemNotEnough, "道具不足")
  170. errorEncoder2.PrintError(ErrItemNotFound, "道具不存在")
  171. errorEncoder2.PrintError(ErrHeroNotFound, "英雄不存在")
  172. errorEncoder2.PrintError(ErrTreasuresNotFound, "宝物不存在")
  173. errorEncoder2.PrintError(ErrDBExec, "数据库错误")
  174. errorEncoder2.PrintError(ErrDBLoadNil, "数据库加载错误")
  175. errorEncoder2.PrintError(ErrRedisExec, "缓存错误")
  176. errorEncoder2.PrintError(ErrTargetNotFound, "目标未发现")
  177. errorEncoder2.PrintError(ErrConfigNotFound, "配置未发现")
  178. errorEncoder2.PrintError(ErrConditionNotEnough, "条件不满足")
  179. errorEncoder1.PrintError(ErrPlayerNoToken, "玩家凭证不存在")
  180. errorEncoder1.PrintError(ErrPlayerBanLogin, "禁止登录")
  181. errorEncoder1.PrintError(ErrPlayerOtherLogin, "异地登录")
  182. errorEncoder1.PrintError(ErrSystemUpgrade, "系统维护")
  183. errorEncoder1.PrintError(ErrSystemFull, "服务器满")
  184. errorEncoder1.PrintError(ErrSystemFoundCheat, "数据异常")
  185. // 20010019100:参数错误
  186. // 20010020100:禁止登录
  187. // 20010020200:异地登录
  188. // 20010029200:玩家未登录
  189. // 20010020300:玩家凭证不存在
  190. // 20010020400:达到最大在线数
  191. // 30020030100:道具不足
  192. // 30020039200:道具不存在
  193. // 30020049200:英雄不存在
  194. // 30020059200:宝物不存在
  195. // 30020060100:数据库错误
  196. // 30020060200:数据库加载错误
  197. // 30020070100:缓存错误
  198. }