Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

server client WithErrorHandler invalid #1224

Open
xu756 opened this issue Jan 12, 2024 · 6 comments
Open

server client WithErrorHandler invalid #1224

xu756 opened this issue Jan 12, 2024 · 6 comments
Assignees
Labels
documentation Improvements or additions to documentation question Further information is requested

Comments

@xu756
Copy link

xu756 commented Jan 12, 2024

我看了官方教程,使用了WithMetaHandler 才能自定义错误,

但明明有错误,client 和 server的WithMetaHandler,调用不了,而且日志也不打印

image

@YangruiEmma
Copy link
Member

有请求才会执行MetaHandler

@xu756
Copy link
Author

xu756 commented Jan 12, 2024

有请求才会执行MetaHandler

就是请求了,返回的是一个error,但WithErrorHandler不执行了,把MetaHandler去掉了,就好了

@cqqqq777
Copy link
Member

cqqqq777 commented Jan 13, 2024

server.ErrorHandler 是使用 kitex 中间件的方式来实现的,会接收 func (s *server) invokeHandleEndpoint() endpoint.Endpoint (源码位于 kitex/server/server.go )返回的错误。在 invokeHandleEndpoint() 函数中,会检查实际 handler 返回的错误(源码),如果在实际 handler 中使用了 kerrors. NewBizStatusError 自定义错误的同时使用了 server.WithMetaHandler,就会返回 nil。

ErrorHandler 的实际运行逻辑如下图,接受到的错误为 nil,所以直接返回了
image

@li-jin-gou li-jin-gou added documentation Improvements or additions to documentation question Further information is requested labels Jan 13, 2024
@YangruiEmma
Copy link
Member

谢谢 @cqqqq777 的回复,@xu756 ErrorHandler 只有rpc error(认定为此次rpc请求失败的异常,不包括 biz error)才会执行,biz error是业务层面定义的状态信息,不算rpc失败。你应该如 @cqqqq777 所说使用了业务异常,所以ErrorHandler没有输出。

  • ErrorHandler 用于基于kitex对异常规范结合自己的需求进行定制,主要框架的封装开发者使用,见 https://www.cloudwego.io/zh/docs/kitex/tutorials/advanced-feature/error_handler/
  • 业务异常:用于微服务开发者,自定义业务上的失败,比如handler里有发起了redis请求但失败了,返回一个状态给client,但从rpc层面来说这是正常的,只是告知client handler的异常状态

@xu756
Copy link
Author

xu756 commented Jan 20, 2024

谢谢 @cqqqq777 的回复,@xu756 ErrorHandler 只有rpc error(认定为此次rpc请求失败的异常,不包括 biz error)才会执行,biz error是业务层面定义的状态信息,不算rpc失败。你应该如 @cqqqq777 所说使用了业务异常,所以ErrorHandler没有输出。

  • ErrorHandler 用于基于kitex对异常规范结合自己的需求进行定制,主要框架的封装开发者使用,见 https://www.cloudwego.io/zh/docs/kitex/tutorials/advanced-feature/error_handler/
  • 业务异常:用于微服务开发者,自定义业务上的失败,比如handler里有发起了redis请求但失败了,返回一个状态给client,但从rpc层面来说这是正常的,只是告知client handler的异常状态

我想把 biz error 替换掉,是可行的吧

@felix021
Copy link
Contributor

如果要处理biz error的话,用可以用中间件来实现,检查 RPCInfo.Invocation().BizStatusErr() 是否为空

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation question Further information is requested
Development

No branches or pull requests

5 participants