Open source

PMQ.ErrorHandling

nível aplicado-em-producao

829 downloads · o maior da suíte · repositório

Tratamento centralizado de erro em ASP.NET Core: filtro de exceção, mapeamento de notificação, validação de estado de modelo e resposta padronizada.

O problema

Cada API responde erro do seu jeito. Uma devolve string, outra um objeto com message, outra o stack trace inteiro em produção. Quem integra precisa tratar cada uma de um jeito, e o log de quem consome fica inútil.

A decisão: adotar padrão em vez de inventar formato

A resposta segue RFC 9457, a especificação de problem details: tipo, título, status, detalhe, instância, mais extensão para os erros de campo. Cliente que conhece o padrão já sabe ler, e não existe documento a manter explicando um formato caseiro.

O mapeamento que fecha o ciclo da suíte

A categoria da notificação vira o código HTTP. É aqui que a decisão tomada no domínio, três camadas atrás, chega ao consumidor da API sem ninguém traduzir no meio:

NotificationType when firstNotificationType == NotificationType.NotFound
    => StatusCodes.Status404NotFound,
NotificationType when firstNotificationType == NotificationType.AccessDenied
    => StatusCodes.Status403Forbidden,
NotificationType when firstNotificationType == NotificationType.InconsistentState
    => StatusCodes.Status409Conflict,
NotificationType when firstNotificationType == NotificationType.BusinessRule
    => StatusCodes.Status422UnprocessableEntity,
NotificationType when firstNotificationType == NotificationType.Validation
    => StatusCodes.Status400BadRequest,
_   => StatusCodes.Status422UnprocessableEntity

Duas escolhas que eu defendo nesse trecho:

422 para regra de negócio, 400 para validação. A distinção é real e quase sempre ignorada: 400 é “a requisição está malformada”, 422 é “a requisição está bem formada e eu me recuso a processá-la”. Cliente que recebe 400 tenta corrigir o formato; quem recebe 422 sabe que o formato está certo e o problema é a regra.

O _ cai em 422, não em 500. Categoria desconhecida é, por definição, uma regra que a biblioteca não conhece, e não uma falha do servidor. Cair em 500 transformaria regra de negócio nova em alarme de infraestrutura.

Pablo Mickael Quevedo Senior Software Engineer · Novo Hamburgo, RS