Kitex 異常說明

2022-04-27 10:56 更新

異常類型

Kitex 框架定義在 ?github.com/cloudwego/kitex/pkg/kerrors? 下

Internal Exception 

?ErrInternalException?, 框架內(nèi)部發(fā)生的錯誤,具體包括以下幾種:

  1. ?ErrNotSupported?, ?"operation not supported"?,進行了尚不支持的操作
  2. ?ErrNoResolver?, ?"no resolver available"?,沒有可用的 resolver
  3. ?ErrNoDestService?, ?"no dest service"?,沒有指定目標(biāo) service
  4. ?ErrNoDestAddress?, ?"no dest address"?,沒有指定目標(biāo)地址
  5. ?ErrNoConnection?, ?"no connection available"?,當(dāng)前沒有可用連接
  6. ?ErrNoIvkRequest?, ?"invoker request not set"?,invoker 模式下調(diào)用時為設(shè)置 request

service discovery error

?ErrServiceDiscovery?, 服務(wù)發(fā)現(xiàn)錯誤,具體錯誤見報錯信息

get connection error

?ErrGetConnection?, 獲取連接錯誤,具體錯誤見報錯信息

loadbalance error

?ErrLoadbalance?, 負(fù)載均衡錯誤

no more instances to retry

?ErrNoMoreInstance?, 沒有可供重試的示例,上一次調(diào)用的錯誤見報錯信息

rpc timeout

?ErrRPCTimeout?, RPC 調(diào)用超時,具體錯誤見報錯信息

request forbidden 

?ErrACL?, 調(diào)用被拒絕,具體錯誤見報錯信息

forbidden by circuitbreaker

?ErrCircuitBreak?, 發(fā)生熔斷后請求被拒絕,通常包含兩種錯誤:

  1. ?ErrServiceCircuitBreak?, ?"service circuitbreak"?,發(fā)生服務(wù)級別熔斷后請求被拒絕
  2. ?ErrInstanceCircuitBreak?, ?"instance circuitbreak"?,發(fā)生實例級別熔斷后請求被拒絕

remote or network error 

?ErrRemoteOrNetwork?, 遠(yuǎn)端服務(wù)發(fā)生錯誤,或者出現(xiàn)網(wǎng)絡(luò)錯誤。具體錯誤見報錯信息

當(dāng)帶有?[remote]? 字樣時,代表此錯誤為遠(yuǎn)端返回

request over limit

?ErrOverlimit?, 過載保護錯誤。通常包括以下兩種錯誤:

  1. ?ErrConnOverLimit?, ?"too many connections"?,連接過載,建立的連接超過限制
  2. ?ErrQPSOverLimit?, ?"request too frequent"?,請求過載,請求數(shù)超過限制

panic

?ErrPanic?, 服務(wù)發(fā)生 panic 。

當(dāng)帶有?[happened in biz handler] ?字樣時,代表 panic 發(fā)生在服務(wù)端 handler 中,此時錯誤信息中會帶上堆棧。

biz error

?ErrBiz?, 服務(wù)端 handler 返回的錯誤。

retry error

?ErrRetry?, 重試時發(fā)生錯誤,具體錯誤見報錯信息。

THRIFT 錯誤碼

該類別對應(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é)議錯誤

異常判斷

判斷是否是 Kitex 的錯誤

可以通過 ?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 ?進行判斷

獲取更詳細(xì)的錯誤信息

?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ì)的信息:

  1. ?ErrorType() error? ,用于獲取基本錯誤類型
  2. ?Stack() string? ,用于獲取堆棧信息(目前僅 ?ErrPanic ?會帶上)


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號