Kitex 異常說明

2022-04-27 10:56 更新

異常類型

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

Internal Exception 

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

  1. ?ErrNotSupported?, ?"operation not supported"?,進(jìn)行了尚不支持的操作
  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í)為設(shè)置 request

service discovery error

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

get connection error

?ErrGetConnection?, 獲取連接錯(cuò)誤,具體錯(cuò)誤見報(bào)錯(cuò)信息

loadbalance error

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

no more instances to retry

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

rpc timeout

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

request forbidden 

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

forbidden by circuitbreaker

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

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

remote or network error 

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

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

request over limit

?ErrOverlimit?, 過載保護(hù)錯(cuò)誤。通常包括以下兩種錯(cuò)誤:

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

panic

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

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

biz error

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

retry error

?ErrRetry?, 重試時(shí)發(fā)生錯(cuò)誤,具體錯(cuò)誤見報(bào)錯(cuò)信息。

THRIFT 錯(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ò)誤

異常判斷

判斷是否是 Kitex 的錯(cuò)誤

可以通過 ?kerrors ?包提供的 ?IsKitexError ?直接進(jìn)行判斷

import "github.com/cloudwego/kitex/pkg/kerrors"
...
isKitexErr := kerrors.IsKitexError(kerrors.ErrInternalException) // 返回 true

判斷具體的錯(cuò)誤類型

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

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

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

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


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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)