异常说明
异常类型
Kitex 框架定义在 github.com/cloudwego/kitex/pkg/kerrors
下
Internal Exception
ErrInternalException
, 框架内部发生的错误,具体包括以下几种:
ErrNotSupported
,"operation not supported"
,进行了尚不支持的操作ErrNoResolver
,"no resolver available"
,没有可用的 resolverErrNoDestService
,"no dest service"
,没有指定目标 serviceErrNoDestAddress
,"no dest address"
,没有指定目标地址ErrNoConnection
,"no connection available"
,当前没有可用连接ErrNoIvkRequest
,"invoker request not set"
,invoker 模式下调用时为设置 request
service discovery error
ErrServiceDiscovery
, 服务发现错误,具体错误见报错信息
get connection error
ErrGetConnection
, 获取连接错误,具体错误见报错信息
loadbalance error
ErrLoadbalance
, 负载均衡错误
no more instances to retry
ErrNoMoreInstance
, 没有可供重试的示例,上一次调用的错误见报错信息
rpc timeout
ErrRPCTimeout
, RPC 调用超时,具体错误见报错信息
request forbidden
ErrACL
, 调用被拒绝,具体错误见报错信息
forbidden by circuitbreaker
ErrCircuitBreak
, 发生熔断后请求被拒绝,通常包含两种错误:
ErrServiceCircuitBreak
,"service circuitbreak"
,发生服务级别熔断后请求被拒绝ErrInstanceCircuitBreak
,"instance circuitbreak"
,发生实例级别熔断后请求被拒绝
remote or network error
ErrRemoteOrNetwork
, 远端服务发生错误,或者出现网络错误。具体错误见报错信息
当带有[remote]
字样时,代表此错误为远端返回
request over limit
ErrOverlimit
, 过载保护错误。通常包括以下两种错误:
ErrConnOverLimit
,"too many connections"
,连接过载,建立的连接超过限制ErrQPSOverLimit
,"request too frequent"
,请求过载,请求数超过限制
panic
ErrPanic
, 服务发生 panic 。
当带有[happened in biz handler]
字样时,代表 panic 发生在服务端 handler 中,此时错误信息中会带上堆栈。
biz error
ErrBiz
, 服务端 handler 返回的错误。
retry error
ErrRetry
, 重试时发生错误,具体错误见报错信息。
THRIFT 错误码
该类别对应 Thrift 框架原生的 Application Exception 错误,通常,这些错误会被 Kitex 框架包装成 remote or network error
。
错误码 | 名称 | 含义 |
---|---|---|
0 | UnknownApplicationException | 未知错误 |
1 | UnknownMethod | 未知方法 |
2 | InValidMessageTypeException | 无效的消息类型 |
3 | WrongMethodName | 错误的方法名字 |
4 | BadSequenceID | 错误的包序号 |
5 | MissingResult | 返回结果缺失 |
6 | InternalError | 内部错误 |
7 | ProtocolError | 协议错误 |
异常判断
判断是否是 Kitex 的错误
可以通过 kerrors
包提供的 IsKitexError
直接进行判断
import "github.com/cloudwego/kitex/pkg/kerrors"
...
isKitexErr := kerrors.IsKitexError(kerrors.ErrInternalException) // 返回 true
判断具体的错误类型
可以通过 errors.Is
进行判断,其中详细错误可以通过详细错误判断,如:
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
提供了下述方法用于获取更详细的信息:
ErrorType() error
,用于获取基本错误类型Stack() string
,用于获取堆栈信息(目前仅ErrPanic
会带上)