Kitex 框架定義在 ?github.com/cloudwego/kitex/pkg/kerrors
? 下
?ErrInternalException
?, 框架內(nèi)部發(fā)生的錯誤,具體包括以下幾種:
ErrNotSupported
?, ?"operation not supported"
?,進行了尚不支持的操作ErrNoResolver
?, ?"no resolver available"
?,沒有可用的 resolverErrNoDestService
?, ?"no dest service"
?,沒有指定目標(biāo) serviceErrNoDestAddress
?, ?"no dest address"
?,沒有指定目標(biāo)地址ErrNoConnection
?, ?"no connection available"
?,當(dāng)前沒有可用連接ErrNoIvkRequest
?, ?"invoker request not set"
?,invoker 模式下調(diào)用時為設(shè)置 request?ErrServiceDiscovery
?, 服務(wù)發(fā)現(xiàn)錯誤,具體錯誤見報錯信息
?ErrGetConnection
?, 獲取連接錯誤,具體錯誤見報錯信息
?ErrLoadbalance
?, 負(fù)載均衡錯誤
?ErrNoMoreInstance
?, 沒有可供重試的示例,上一次調(diào)用的錯誤見報錯信息
?ErrRPCTimeout
?, RPC 調(diào)用超時,具體錯誤見報錯信息
?ErrACL
?, 調(diào)用被拒絕,具體錯誤見報錯信息
?ErrCircuitBreak
?, 發(fā)生熔斷后請求被拒絕,通常包含兩種錯誤:
ErrServiceCircuitBreak
?, ?"service circuitbreak"
?,發(fā)生服務(wù)級別熔斷后請求被拒絕ErrInstanceCircuitBreak
?, ?"instance circuitbreak"
?,發(fā)生實例級別熔斷后請求被拒絕?ErrRemoteOrNetwork
?, 遠(yuǎn)端服務(wù)發(fā)生錯誤,或者出現(xiàn)網(wǎng)絡(luò)錯誤。具體錯誤見報錯信息
當(dāng)帶有?[remote]
? 字樣時,代表此錯誤為遠(yuǎn)端返回
?ErrOverlimit
?, 過載保護錯誤。通常包括以下兩種錯誤:
ErrConnOverLimit
?, ?"too many connections"
?,連接過載,建立的連接超過限制ErrQPSOverLimit
?, ?"request too frequent"
?,請求過載,請求數(shù)超過限制?ErrPanic
?, 服務(wù)發(fā)生 panic 。
當(dāng)帶有?[happened in biz handler]
?字樣時,代表 panic 發(fā)生在服務(wù)端 handler 中,此時錯誤信息中會帶上堆棧。
?ErrBiz
?, 服務(wù)端 handler 返回的錯誤。
?ErrRetry
?, 重試時發(fā)生錯誤,具體錯誤見報錯信息。
該類別對應(yīng) Thrift 框架原生的 Application Exception 錯誤,通常,這些錯誤會被 Kitex 框架包裝成 ?remote or network error
? 。
錯誤碼 | 名稱 | 含義 |
---|---|---|
0 | UnknownApplicationException | 未知錯誤 |
1 | UnknownMethod | 未知方法 |
2 | InValidMessageTypeException | 無效的消息類型 |
3 | WrongMethodName | 錯誤的方法名字 |
4 | BadSequenceID | 錯誤的包序號 |
5 | MissingResult | 返回結(jié)果缺失 |
6 | InternalError | 內(nèi)部錯誤 |
7 | ProtocolError | 協(xié)議錯誤 |
可以通過 ?kerrors
?包提供的 ?IsKitexError
?直接進行判斷
import "github.com/cloudwego/kitex/pkg/kerrors"
...
isKitexErr := kerrors.IsKitexError(kerrors.ErrInternalException) // 返回 true
可以通過 ?errors.Is
? 進行判斷,其中詳細(xì)錯誤可以通過詳細(xì)錯誤判斷,如:
import "errors"
import "github.com/cloudwego/kitex/client"
import "github.com/cloudwego/kitex/pkg/kerrors"
...
_, err := echo.NewClient("echo", client.WithResolver(nil)) // 返回 kerrors.ErrNoResolver
...
isKitexErr := errors.Is(err, kerrors.ErrNoResolver) // 返回 true
也可以通過基本錯誤進行判斷,如:
import "errors"
import "github.com/cloudwego/kitex/client"
import "github.com/cloudwego/kitex/pkg/kerrors"
...
_, err := echo.NewClient("echo", client.WithResolver(nil)) // 返回 kerrors.ErrNoResolver
...
isKitexErr := errors.Is(err, kerrors.ErrInternalException) // 返回 true
特別的,?timeout
?錯誤可以通過 ?kerrors
?包提供的 ?IsTimeoutError
?進行判斷
?kerrors
?中所有的具體錯誤類型都是 ?kerrors
?包下的 ?DetailedError
?,故而可以通過 ?errors.As
? 獲取到實際的 ?DetailedError
?,如:
import "errors"
import "github.com/cloudwego/kitex/client"
import "github.com/cloudwego/kitex/pkg/kerrors"
...
_, err := echo.NewClient("echo", client.WithResolver(nil)) // 返回 kerrors.ErrNoResolver
...
var de *kerrors.DetailedError
ok := errors.As(err, &ke) // 返回 true
if de.ErrorType() == kerrors.ErrInternalException {} // 返回 true
?DetailedError
?提供了下述方法用于獲取更詳細(xì)的信息:
ErrorType() error
? ,用于獲取基本錯誤類型
Stack() string
? ,用于獲取堆棧信息(目前僅 ?ErrPanic
?會帶上)
更多建議: