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