Tooark.Exceptions 4.0.1

dotnet add package Tooark.Exceptions --version 4.0.1
                    
NuGet\Install-Package Tooark.Exceptions -Version 4.0.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Tooark.Exceptions" Version="4.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Tooark.Exceptions" Version="4.0.1" />
                    
Directory.Packages.props
<PackageReference Include="Tooark.Exceptions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Tooark.Exceptions --version 4.0.1
                    
#r "nuget: Tooark.Exceptions, 4.0.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Tooark.Exceptions@4.0.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Tooark.Exceptions&version=4.0.1
                    
Install as a Cake Addin
#tool nuget:?package=Tooark.Exceptions&version=4.0.1
                    
Install as a Cake Tool

Tooark.Exceptions

Biblioteca que fornece exceções padronizadas para projetos .NET, com mapeamento para status HTTP e suporte a múltiplas formas de construção de mensagens de erro.

Conteúdo

Instalação

dotnet add package Tooark.Exceptions

O pacote não tem configuração nem registro no container: as exceções são lançadas e capturadas diretamente.

Visão Geral

Todas as exceções específicas do pacote herdam de TooarkException, que por sua vez herda de Exception. A classe base é abstrata e seus construtores são protegidos — ela não é instanciada diretamente, e sim estendida, seja pelas exceções do pacote, seja pelas da sua aplicação.

A classe base concentra:

  • mensagens de erro (GetErrorMessages());
  • notificações equivalentes (GetNotifications());
  • contrato para código HTTP (GetStatusCode()).

Duas garantias valem para qualquer construtor:

  • As coleções são somente leitura. GetErrorMessages() e GetNotifications() devolvem sempre a mesma instância somente leitura, então nenhum código externo consegue esvaziar ou alterar o erro que a exceção carrega — o que faria uma falha desaparecer no meio do tratamento.
  • As coleções nunca ficam vazias. Entrada nula, vazia ou sem mensagens registra uma chave conhecida em vez de produzir uma exceção que se diz de erro mas não carrega erro algum. As duas leituras andam juntas: a mesma posição descreve o mesmo erro em ambas.

Recursos Suportados

As classes de exceção suportam os seguintes construtores:

Construtor Uso
ExceptionType(string message) Mensagem única
ExceptionType(string message, Exception innerException) Mensagem única preservando a causa raiz
ExceptionType(IList<string> messages) Várias mensagens, para validação com mais de uma falha
ExceptionType(Notification notification) Reaproveita notificações já agregadas na camada de validação
ExceptionType(string messageFormat, params object[] args) Mensagem dinâmica com marcadores {0}, {1}, etc.

Resolução de sobrecarga: new NotFoundException("Falha: {0}", exceptionObject) liga ao construtor de exceção interna, não ao de formatação, porque Exception é o parâmetro mais específico. Para formatar usando uma exceção como argumento, converta-a antes (por exemplo ex.Message).

Ao usar a formatação, o formato incompatível com os parâmetros não lança: a mensagem é mantida como recebida. A exceção existe para reportar o erro original, e falhar na própria apresentação trocaria o erro real por uma FormatException. Mensagens com chaves literais, como JSON, caem nesse caso.

Mensagens de Erro

A classe estática ExceptionErrorMessages reúne as mensagens geradas pelo próprio pacote. São chaves de tradução, e não textos finais.

Constante Valor Quando ocorre
MessageIsNullOrEmpty Exceptions.MessageNullEmpty Mensagem nula, vazia ou composta apenas por espaços em branco
ErrorsIsNullOrEmpty Exceptions.ErrorsNullOrEmpty Lista de mensagens ou notificação nula, ou sem nenhuma mensagem

Tratamento de valores nulos:

Situação Comportamento
null como mensagem única Registra Exceptions.MessageNullEmpty
null ou lista vazia em IList<string> Registra Exceptions.ErrorsNullOrEmpty
null ou notificação sem itens Registra Exceptions.ErrorsNullOrEmpty
Item nulo dentro da lista Vira Exceptions.MessageNullEmpty nas duas coleções

Exceções Disponíveis

Classe Status HTTP
GetInfoException 400 (BadRequest)
BadRequestException 400 (BadRequest)
UnauthorizedException 401 (Unauthorized)
ForbiddenException 403 (Forbidden)
NotFoundException 404 (NotFound)
MethodNotAllowedException 405 (MethodNotAllowed)
ConflictException 409 (Conflict)
PayloadTooLargeException 413 (RequestEntityTooLarge)
UnsupportedMediaTypeException 415 (UnsupportedMediaType)
UnprocessableEntityException 422 (UnprocessableEntity)
TooManyRequestsException 429 (TooManyRequests)
InternalServerErrorException 500 (InternalServerError)
BadGatewayException 502 (BadGateway)
ServiceUnavailableException 503 (ServiceUnavailable)
GatewayTimeoutException 504 (GatewayTimeout)

O parêntese indica o membro de System.Net.HttpStatusCode. Para o 413 o .NET mantém o nome antigo RequestEntityTooLarge, embora o RFC 7231 chame o status de Payload Too Large.

Exemplos de Uso

1) Mensagem simples

throw new BadRequestException("Payload inválido.");

2) Múltiplas mensagens

throw new BadRequestException([
  "Nome é obrigatório.",
  "E-mail inválido."
]);

3) Mensagem formatada

var userId = 42;
throw new NotFoundException("Usuário com ID {0} não encontrado.", userId);

4) A partir de Notification

A criação de notificações é protegida, então quem notifica é o próprio objeto:

using Tooark.Notifications;

public sealed class DomainNotification : Notification
{
  public void NotifyRequired(string campo) =>
    AddNotification($"{campo} é obrigatório.", campo, "T.DOM1");
}

var notification = new DomainNotification();
notification.NotifyRequired("Document");
notification.NotifyRequired("Phone");

throw new BadRequestException(notification);

Os itens da notificação são preservados como estão, mantendo a chave e o código de cada um.

5) Preservando a causa raiz

try
{
  await _httpClient.GetAsync(url, cancellationToken);
}
catch (HttpRequestException ex)
{
  // A exceção original continua acessível em InnerException, para diagnóstico
  throw new BadGatewayException("Serviço de pagamentos indisponível.", ex);
}

6) Tratamento padronizado

using Tooark.Exceptions;

try
{
  throw new ServiceUnavailableException("Serviço externo indisponível.");
}
catch (TooarkException ex)
{
  var statusCode = ex.GetStatusCode();
  var errors = ex.GetErrorMessages();
  var notifications = ex.GetNotifications();

  Console.WriteLine($"Status: {(int)statusCode} - {statusCode}");
  Console.WriteLine($"Primeiro erro: {errors[0]}");
  Console.WriteLine($"Total de notificações: {notifications.Count}");
}

errors[0] é seguro: as coleções nunca ficam vazias.

7) Conflito de estado (409)

throw new ConflictException("Já existe um usuário com este e-mail.");

8) Payload muito grande (413)

throw new PayloadTooLargeException(
  "Arquivo excede o limite permitido de {0} MB.",
  10
);

9) Tipo de mídia não suportado (415)

throw new UnsupportedMediaTypeException("Content-Type 'text/plain' não é suportado.");

10) Entidade não processável (422)

throw new UnprocessableEntityException([
  "CPF inválido para a regra de negócio.",
  "Data de nascimento incompatível com o cadastro."
]);

11) Muitas requisições (429)

throw new TooManyRequestsException("Limite de requisições excedido. Tente novamente em alguns segundos.");

12) Criando a sua própria exceção

A hierarquia é aberta: basta herdar de TooarkException e informar o código HTTP. Todos os construtores da base ficam disponíveis, com as mesmas garantias de coleção somente leitura e nunca vazia.

using System.Net;
using Tooark.Exceptions;
using Tooark.Notifications;

public class PaymentRequiredException : TooarkException
{
  public PaymentRequiredException(string message) : base(message) { }

  public PaymentRequiredException(string message, Exception innerException)
    : base(message, innerException) { }

  public PaymentRequiredException(IList<string> messages) : base(messages) { }

  public PaymentRequiredException(Notification notification) : base(notification) { }

  public PaymentRequiredException(string messageFormat, params object[] args)
    : base(messageFormat, args) { }

  public override HttpStatusCode GetStatusCode() => HttpStatusCode.PaymentRequired;
}

O catch (TooarkException ex) do tratamento padronizado passa a capturá-la junto com as demais.

Dependências

Pacote Versão Uso
Tooark.Notifications 4.x Notification e NotificationItem

O pacote não depende de ASP.NET Core: o código HTTP é exposto como System.Net.HttpStatusCode, do próprio runtime, e a tradução para a resposta fica a cargo da aplicação.

Contribuição

Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests no repositório Tooark.Exceptions.

Licença

Este projeto está licenciado sob a licença BSD 3-Clause. Veja o arquivo LICENSE para mais detalhes.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (11)

Showing the top 5 NuGet packages that depend on Tooark.Exceptions:

Package Downloads
Tooark.Utils

General utility package for .NET applications.

Tooark.Enums

Package for creating validated enumerators for .NET applications.

Tooark.ValueObjects

Package for managing predefined and validated Value Objects for .NET applications.

Tooark.Entities

Package for managing base entities in .NET applications.

Tooark.Attributes

Package for creating attribute validators for .NET applications.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.0.1 322 8/25/2026
4.0.0 323 8/25/2026
3.3.5 226 8/25/2026
3.3.4 406 8/12/2026
3.3.3 511 7/27/2026
3.3.2 518 6/11/2026
3.3.1 302 6/6/2026
3.3.0 269 4/17/2026
3.2.3 239 4/17/2026
3.2.2 235 3/23/2026
3.2.1 230 3/23/2026
3.2.0 327 1/21/2026
3.1.0 251 1/10/2026
3.0.0 287 1/9/2026
2.3.4 181 8/25/2026
2.3.3 217 7/27/2026
2.3.2 221 4/17/2026
2.3.1 213 3/23/2026
2.3.0 239 1/21/2026
2.2.1 234 1/6/2026
Loading failed