Saltar para o conteúdo principal
Toda recusa carrega um ErrorDetail nos detalhes do status, e ele diz o que o POST /secure/send teria respondido para a mesma requisição. Então tudo o que está escrito sobre erros do REST vale aqui também — o código gRPC é o jeito do transporte de dizer isso, e o ErrorDetail é o detalhe.

Lendo ErrorDetail

Ele viaja no trailer padrão de rich status (grpc-status-details-bin). Leia com o helper da sua biblioteca: Num SendStream o mesmo ErrorDetail chega inline no campo error do resultado, ao lado do code numérico. Decida pelo code, não pela message. A mensagem é para uma pessoa lendo um log e pode ter outra redação numa versão futura; os códigos fazem parte do contrato congelado. Quando um retry ajuda, um google.rpc.RetryInfo padrão é empacotado ao lado do ErrorDetail com o mesmo atraso, para as bibliotecas cliente que o respeitam.

Envio

Nada recusado é cobrado, e nada recusado conta contra o seu limite de taxa.
RESOURCE_EXHAUSTED significa duas coisas diferentes aqui. Com um ErrorDetail cujo código é RATE_LIMITED, diminua o ritmo. Sem nenhum ErrorDetail, a requisição era grande demais e nunca vai dar certo do jeito que está.

OUTCOME_UNKNOWN: repita só com client_ref

OUTCOME_UNKNOWN é UNKNOWN, não UNAVAILABLE, de propósito. A mensagem pode estar a caminho e já foi cobrada. Muitas bibliotecas cliente gRPC repetem UNAVAILABLE automaticamente — o que aqui a enviaria duas vezes.Repita um UNKNOWN só com o mesmo client_ref. Se a primeira tentativa passou, você recebe o message_id dela de volta com duplicate: true e nada é enviado de novo. Se não passou, o retry a envia. Sem um client_ref não existe retry seguro: o message_id no detalhe é o que você deve procurar num recibo.
Pelo mesmo motivo, se você configurar uma política de retry na sua biblioteca cliente (um retryPolicy no service config do gRPC), inclua nela UNAVAILABLE e RESOURCE_EXHAUSTED e nunca UNKNOWN.

Sessões e a própria API

UNAUTHENTICATED cobre três situações diferentes, então leia o ErrorDetail.code: só SESSION_EXPIRED se resolve fazendo login de novo. Veja Autenticação e sessões.

Recibos

Um Ack que nomeia um recibo que já se foi não é um erro — ele é contado em already_gone. Veja Recibos de entrega via gRPC.

Relacionados

Erros da API REST

As mesmas recusas, como status HTTP.

Tratamento de erros

Construindo para o recibo, e não para a resposta.