Skip to content

PT BR Ciclo de erros e resultados

Vinícius Campos edited this page Aug 22, 2026 · 2 revisions

Ciclo de erros e resultados

English · Início em português

Um Error é dado imutável: Code escolhe uma entrada de template, ErrorCode é o identificador estável de tela para o cliente, Kind controla a semântica de transporte, Arguments preenche tokens e Field identifica um input quando aplicável. Factories cobrem o conjunto fechado de ErrorKind; Error.Custom fornece um código de catálogo específico do negócio reutilizando um desses kinds.

flowchart LR
    Rule[Regra de domínio] --> Error[Factory de Error ou Error.Custom]
    Error --> Failure[Result.Failure ou Result de T.Failure]
    Failure --> Compose[Bind / Map / Combine / Match]
    Compose --> Boundary{Borda da aplicação}
    Boundary -->|Minimal API| Http[ToHttpResult]
    Boundary -->|MVC| Mvc[ToActionResult]
    Boundary -->|FastEndpoints| Send[SendOffsideAsync]
    Http --> Problem[OffsideProblem]
    Mvc --> Problem
    Send --> Problem
Loading

Result representa sucesso sem valor; Result<T> carrega um valor no sucesso. Uma falha contém pelo menos um erro. Os construtores fazem snapshot das sequências, e Combine concatena os erros de todos os resultados falhos na ordem de entrada. Bind interrompe em falha, Map transforma apenas sucesso e Match torna os dois ramos explícitos. Deliberadamente não há conversão implícita de T nem Apply aplicativo.

Escolha HTTP

Na borda ASP.NET, sucesso vira 204 para Result e 200 com o valor para Result<T>. Uma falha relata todos os erros, mas escolhe um erro primário por severidade; em empate, preserva o primeiro na ordem do resultado. Os kinds mapeiam para o conjunto fixo de status 400, 401, 403, 404, 409, 410, 412, 422, 429 e 500.

A resposta é application/problem+json, com campos Problem Details mais errorCode, traceId, errors e, opcionalmente, debug. O texto da mensagem só é resolvido nessa borda.

Falhas inesperadas são explícitas

O caminho de sanitização de 500 vale sempre que o erro primário selecionado tem Kind == ErrorKind.Unexpected, inclusive para Error.Custom(..., ErrorKind.Unexpected, ...); ele não se limita a erros criados por Error.Unexpected(...). Todo erro inesperado nessa resposta recebe a mensagem genérica unexpected resolvida na cultura selecionada e um errorCode público forçado para UNEXPECTED. O detail de diagnóstico do erro primário aparece em debug somente quando esse argumento foi fornecido e ExposeExceptionDetails está habilitado. O adaptador ASP.NET também tenta registrar o primeiro erro inesperado quando o status escolhido é 500.

Offside não tem handler global de exceção. Uma exceção arbitrária lançada não é convertida, sanitizada, registrada nem devolvida pela biblioteca. A aplicação precisa adicionar sua própria política. Do mesmo modo, error.ToException() cria uma DomainException, mas não instala nada que a capture.

Veja as factories e combinadores no Guia de domínio e o contrato de rede em ASP.NET Core.

Clone this wiki locally