Lesson 14 / 25

Status Codes and Rich Errors

Choose the right code.

A fixed set of codes

Every gRPC call ends with a status: a code plus a message. Common codes: OK, INVALID_ARGUMENT (bad input), NOT_FOUND, ALREADY_EXISTS, PERMISSION_DENIED, UNAUTHENTICATED, RESOURCE_EXHAUSTED (quota or rate limit), FAILED_PRECONDITION (system not in the required state), ABORTED (concurrency conflict), UNAVAILABLE (transient, safe to retry), DEADLINE_EXCEEDED, UNIMPLEMENTED and INTERNAL. For structured details, the richer error model (google.rpc.Status with details such as BadRequest field violations) carries machine-readable information.

Choosing codes

Situations and suitable status codes.

email field is malformed                     -> INVALID_ARGUMENT (+ BadRequest field violation)
order id does not exist                      -> NOT_FOUND
no or invalid credentials                    -> UNAUTHENTICATED
valid user lacks permission                  -> PERMISSION_DENIED
cannot cancel an order that already shipped  -> FAILED_PRECONDITION
optimistic-lock version conflict             -> ABORTED
per-user quota exceeded                      -> RESOURCE_EXHAUSTED
dependency temporarily down                  -> UNAVAILABLE   (retryable)
unexpected bug                               -> INTERNAL      (do not leak details)

Do not use UNKNOWN or INTERNAL for client mistakes

Specific codes let clients decide whether to fix the request, retry or give up.

Quick check: Which status code is generally safe to retry?

  • NOT_FOUND
  • INVALID_ARGUMENT
  • PERMISSION_DENIED
  • UNAVAILABLE
Answer

UNAVAILABLE — Transient failures only.