Pular para o conteúdo principal

Tratamento de erros

O SDK traduz as respostas HTTP de erro em uma hierarquia de exceções tipada, então você trata por tipo em vez de inspecionar status codes na mão. Todas estendem MerxApiException (que por sua vez é RuntimeException — não exige try/catch obrigatório).

Hierarquia

ExceçãoQuandoStatus HTTP
MerxBadRequestExceptionRequisição inválida400
MerxUnauthorizedExceptionToken ausente/ inválido401
MerxForbiddenExceptionSem permissão403
MerxNotFoundExceptionRecurso não existe404
MerxConflictExceptionConflito de estado409
MerxValidationExceptionFalha de validação (carrega os erros por campo)422
MerxServerExceptionErro do servidor5xx
MerxApiExceptionQualquer status não mapeado (classe base)demais
MerxClientExceptionFalha local (rede, timeout, serialização) — não é resposta HTTP

Todas as MerxApiException expõem getStatusCode() e getResponseBody() (corpo cru) para inspeção quando o tipo não basta.

Tratando por tipo

import com.merx.sdk.core.exception.*;

try {
// operações que mutam (create/update/delete) lançam exceção em erro HTTP
merx.producers().update(id, request);
} catch (MerxNotFoundException e) {
// 404 — recurso não existe
} catch (MerxValidationException e) {
// 422 — erros por campo
e.getFieldErrors().forEach((campo, msg) -> log.warn("{}: {}", campo, msg));
} catch (MerxApiException e) {
// qualquer outro erro HTTP
log.error("Merx {} -> {}", e.getStatusCode(), e.getResponseBody());
} catch (MerxClientException e) {
// falha de rede/serialização (não chegou resposta)
}

Finders retornam Optional

Métodos de busca não lançam em 404 — retornam Optional.empty(). Use sem try/catch:

merx.producers().findById(id)
.ifPresentOrElse(
p -> processa(p),
() -> log.info("produtor não encontrado"));

Retry automático

Falhas transitórias (5xx, 429, IOException/timeout) já passam por retry com backoff antes de virarem exceção — você só recebe a exceção quando as tentativas se esgotam. Erros 4xx (exceto 429) não são retentados. Veja Configuração avançada.