不管在什麼系統中, 定義錯誤碼都是必不可少的.
錯誤碼可以幫助定義問題, 通常錯誤碼設計為某種模式結構, 可以判斷出錯誤的級別, 錯誤的模組和具體錯誤資訊.
乙個良好結構的錯誤碼有助於簡化問題描述, 當前設計的錯誤碼共有五位, 結構如下:
| 1 | 00 | 01 | | -------- | ---- | -------- | | 服務級別 | 模組 | 具體錯誤 |
第一位是服務級別, 1 為系統錯誤, 2 為普通錯誤.
第二三位是模組, 模組不是指 go 中的模組, 而是指代某個範圍, 比如資料庫錯誤, 認證錯誤.
第四五位是具體錯誤, 比如資料庫錯誤中的插入錯誤, 找不到資料等.
定義錯誤碼的時候不光有 code 數字, 也會有對應的文字資訊, 通常, 文字分為兩類, 一類是給使用者看的, 另一類是用於 debug 的.
在 pkg 目錄下新建乙個 errno 目錄, 並建立相應的模組.
package errno
import "fmt"
// 定義錯誤碼
type errno struct
func (err errno) error() string
// 定義錯誤
type err struct
func (err *err) error() string
上面定義了兩種資料結構, 每一種都實現了 error() 方法, 也就是繼承了 error 介面.
errno 定義了錯誤碼的結構, 會在另乙個檔案中統一定義所有的錯誤碼. err 定義了完整的錯誤的結構, 通常可以理解為 errno 和乙個內部錯誤的結合.
// 使用 錯誤碼 和 error 建立新的 錯誤
func new(errno *errno, err error) *err
}
new 函式從乙個 errno 和 error 中返回新的 err, 這樣就包裝了內部錯誤.
另乙個重要的方法是解碼錯誤, 獲取 code 和 message.
// 解碼錯誤, 獲取 code 和 message
func decodeerr(err error) (int, string)
switch typed := err.(type)
return typed.code, typed.message
case *errno:
return typed.code, typed.message
default:
}return internalservererror.code, err.error()
}
在設計完成 errno 模組之後, 我們需要定義一些常見的錯誤碼.
package errno
/*錯誤碼設計
第一位表示錯誤級別, 1 為系統錯誤, 2 為普通錯誤
第二三位表示服務模組**
第四五位表示具體錯誤**
*/var (
ok = &errno
// 系統錯誤, 字首為 100
internalservererror = &errno
errbind = &errno
errtokensign = &errno
errencrypt = &errno
// 資料庫錯誤, 字首為 201
errdatabase = &errno
errfill = &errno
// 認證錯誤, 字首是 202
errvalidation = &errno
errtokeninvalid = &errno
// 使用者錯誤, 字首為 203
errusernotfound = &errno
errpasswordincorrect = &errno
)
錯誤碼是 api 服務中不可缺少的一環, 但錯誤碼的結構設計卻是千差萬別, 這個時候還是要多參考一些大廠的開放 api 設計, 找出共性, 去粗取精.
作為版本 v0.5.0
說明, 當前分支下定義的錯誤碼和上文中顯示的不一樣, 還是以文章為主, 因為寫文章也是乙個思考的過程, 所以有時會對**做一點改動.
錯誤碼總結
200 伺服器成功返回網頁 404 請求網頁不存在 1xx 臨時相應 表示臨時相應並需要請求者繼續執行操作 100 繼續 請求者應當繼續提出請求。伺服器返回此 表示已收到請求的第一部分,正在等待其餘部分 101 切換協議 請求者已要求伺服器切換協議,伺服器已確認並準備切換 2xx 成功 表示成功處理...
mysql624錯誤碼 mysql錯誤碼問題
1級2018 11 18 回答 這裡列出部分,詳情可參考 訊息 無法建立檔案 s errno d 錯誤 1005 sqlstate hy000 er cant create table 訊息 無法建立表 s errno d 錯誤 1006 sqlstate hy000 er cant create ...
C 定義錯誤碼類
我們平時有這樣的需求,可能是c使用者的老習慣了,在底層的元件中更喜歡用返回錯誤碼的形式來告知使用者函式的呼叫狀態,一般來說,簡單用 define 乙個巨集來包裝下返回值。define err system init 23 system initailized fail 比如,以上定義了乙個錯誤碼返回...