в grpc-gateway, как мы можем связать несколько обработчиков ошибок
например, это будет выглядеть так
import "github.com/grpc-ecosystem/grpc-gateway/runtime"
//first error handler
var runTimeError1 = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
stat, ok := status.FromError(err)
fmt.Println("body")
if !ok || len(stat.Details()) != 1 {
fmt.Println("in unknown error")
}
statusCode := runtime.HTTPStatusFromCode(stat.Code())
fmt.Println("code", statusCode)
}
// another error handler
var runTimeError2 = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
stat, ok := status.FromError(err)
fmt.Println("body")
if !ok || len(stat.Details()) != 1 {
fmt.Println("in unknown error")
}
statusCode := runtime.HTTPStatusFromCode(stat.Code())
fmt.Println("code", statusCode)
}
runtime.HTTPError = runTimeError1
Что мне нужно, так это объединить обе ошибки в цепочку что-то вроде этого
runtime.HTTPError = [runTimeError1,runTimeError2]
Возможна ли вышеуказанная реализация в grpc-gateway??
@NotX, я хотел бы объединить обработчики ошибок, например, один обработчик будет регистрировать ошибку в файлах или каком-либо другом сборщике журналов, а другой обработчик ошибок будет обрабатывать ошибки для конечного пользователя (выходные данные API остальных)
Вы можете объединить все обработчики в один. Вот немного переработанный пример:
type ErrHandler func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error)
type ChainedErrHandler []ErrHandler
func (c ChainedErrHandler) Merge() ErrHandler {
return func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
for _, handler := range c {
handler(ctx, mux, marshaler, w, r, err)
}
}
}
func main() {
var runTimeError1 ErrHandler = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
fmt.Println("handling error", err, "in handler 1")
}
var runTimeError2 ErrHandler = func(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
fmt.Println("handling error", err, "in handler 2")
}
chainedHandlers := ChainedErrHandler{runTimeError1, runTimeError2}.Merge()
runtime.HTTPError = chainedHandlers
}
Спасибо за ответ, попробую
@shamonshamsudeen Всегда пожалуйста! Если вам нужны дополнительные разъяснения, не стесняйтесь спрашивать. Если вы этого не сделаете и ваша проблема решена, отметьте этот ответ как «принятый». ;)
Какого поведения вы ожидаете? Разные обработчики для разных ошибок? Или оба обработчика что-то делают с ошибкой? В общем, вы можете объединить/связать обработчики ошибок в один обработчик и назначить его.