-
Notifications
You must be signed in to change notification settings - Fork 0
PT BR Ciclo de erros e resultados
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
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.
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.
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.
Código e docs/ são canônicos · Code and docs/ are canonical · Base dbca345372483477097385eb43d850484b00ec13 · 2026-08-22 · Repositório / Repository