Exceções Customizadas: Simplificando o Debug no Código

Imagine se o seu programa de controle de estoque está prestes a lançar um erro genérico “Exception” que não diz nada sobre o que realmente aconteceu. Já pensou na dor de cabeça para entender a causa real? Isso é um sinal de que está na hora de criar📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. exceções customizadas💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código.! Elas servem para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! fornecer mensagens claras, específicas e alinhadas com a lógica do seu negócio - tornando a resolução de problemas muito mais simples e intuitiva.

A ideia é bem simples: em vez de usar apenas as exceções “prontas” do C#, você pode criar suas próprias classes que herdam de “Exception” (ou outra classe base🧬 Herança: Reutilize Código sem Copiar e Colar (como um Jedi)!🧬 Herança: Reutilize Código sem Copiar e Colar (como um Jedi)!Aprenda a utilizar herança em C# para criar hierarquias de classes, reaproveitar código e manter projetos organizados de forma simples e escalável.) para representar situações de erro da forma que faça sentido para o seu domínio, como “EstoqueInsuficienteException” ou “UsuarioNaoAutorizadoException”.

Tabela de Conteúdo🔗

Por que Criar Exceções Customizadas?🔗

A principal razão é clareza. Com exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. definidas por você, suas mensagens de erro ficam mais próximas da regra de negócio ou do contexto do problema. Em vez de receber um genérico e assustador “Exception”, você pode ter algo como “EstoqueInsuficienteException” para deixar explícito o que deu errado.

Além disso, quando alguém (ou até mesmo você no futuro) for depurar o código, ter uma exceção com nome autoexplicativo acelera muito a identificação do problema🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes..

Cenário real: Sistema bancário

// ❌ Ruim: Exceção genérica
if (saldo < valorSaque)
    throw new InvalidOperationException("Operação inválida");
// ✅ Bom: Exceção específica
if (saldo < valorSaque)
    throw new SaldoInsuficienteException(saldo, valorSaque);

Vantagens:

Estrutura Básica de uma Exceção Customizada🔗

Uma exceção customizada💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. em C# costuma herdar de Exception (ou de outra exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. base mais específica), e segue esta estrutura:

public class MinhaExcecaoPersonalizada : Exception
{
    public MinhaExcecaoPersonalizada() { }
    public MinhaExcecaoPersonalizada(string message)
        : base(message)
    {
    }
    public MinhaExcecaoPersonalizada(string message, Exception inner)
        : base(message, inner)
    {
    }
}

1. Herdar de Exception: É o ponto de partida para qualquer exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. personalizada.

2. Construtores🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos.: Normalmente você replica os construtores🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!🔑 Construtores: Inicialize Objetos como um Arquiteto de OOP!Descubra como os construtores em C# estruturam objetos, garantindo inicialização segura e promovendo boas práticas de desenvolvimento orientado a objetos. que recebe de “Exception”, para não perder nenhuma funcionalidade.

3. Properties extras (opcional): Se você precisar armazenar dados específicos do erro, pode criar propriedades⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!⚡ Propriedades: Get e Set com Elegância (e sem Campos Privados Bagunçados)!Aprenda como utilizar propriedades em C# para encapsular dados, validar informações e manter um código organizado, seguro e de fácil manutenção. adicionais na sua classe.

Exemplo Prático: Criando Exceções que Falam a sua Língua🔗

Pense num sistema de vendas que precisa checar o estoque antes de concluir a compra. Se não houver livros suficientes em estoque, faz sentido lançar uma exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. “EstoqueInsuficienteException”. Assim:

public class EstoqueInsuficienteException : Exception
{
    public int QuantidadeDisponivel { get; private set; }
    // Construtor base
    public EstoqueInsuficienteException()
        : base("Estoque insuficiente para completar a operação.")
    {
    }
    // Construtor que recebe uma mensagem
    public EstoqueInsuficienteException(string message)
        : base(message)
    {
    }
    // Construtor que aceita a quantidade disponível para enriquecer o erro
    public EstoqueInsuficienteException(string message, int quantidadeDisponivel)
        : base(message)
    {
        QuantidadeDisponivel = quantidadeDisponivel;
    }
}

Quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. você for verificar o estoque:

int estoqueAtual = 5;
int quantidadeSolicitada = 10;
if (quantidadeSolicitada > estoqueAtual)
{
    throw new EstoqueInsuficienteException(
        $"Quantidade solicitada excede o estoque disponível!",
        estoqueAtual
    );
}

Veja como a exceção💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. não apenas deixa claro que o estoque é insuficiente, mas também informa quantas unidades estão realmente disponíveis, caso você queira exibir essa informação para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! quem fez a requisição.

Boas Práticas de Nomenclatura e Organização🔗

Mantenha coerência e consistência para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! que toda a equipe saiba de imediato sobre o que o seu custom exception se trata.

Vantagens e Possíveis Desvantagens🔗

Pontos PositivosPontos Negativos
Melhora a clareza ao lidar com erros específicos.Excesso de classes de exceção pode poluir o código.
Mensagens de erro mais direcionadas ao domínio.Nem sempre é necessário criar exceções para cada caso.
Facilita o debug e a manutenção do sistema.Pode levar a complexidade extra se mal planejado.

Em resumo, o uso correto de exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. personalizadas deixa o seu sistema mais expressivo e seguro🛡️ Segurança em SignalR: Autenticação e Autorização!🛡️ Segurança em SignalR: Autenticação e Autorização!Descubra como implementar JWT e autorização com roles e claims no SignalR, garantindo segurança e controle de acessos em tempo real., mas crie apenas se fizer sentido real no contexto do seu projeto🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes..

Hierarquia de Exceções: Organizando o Caos🔗

Uma boa prática é organizar suas exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. em hierarquias. Isso facilita a captura seletiva de erros e a organização do código. Por exemplo:

classDiagram Exception <|-- ExcecaoNegocio ExcecaoNegocio <|-- PagamentoRecusadoException ExcecaoNegocio <|-- ClienteNaoEncontradoException Exception <|-- ExcecaoInfraestrutura ExcecaoInfraestrutura <|-- DatabaseTimeoutException

Benefícios:

Integração com APIs REST🔗

Ao trabalhar com APIs REST, você pode criar um middleware🔒 Middleware: Intercepte Requests como um Vigilante!🔒 Middleware: Intercepte Requests como um Vigilante!Descubra como usar middlewares no ASP.NET Core para monitorar, validar e controlar o fluxo de requisições de forma segura e eficiente em seu projeto. personalizado para tratar suas exceções e retornar respostas consistentes:

// Middleware personalizado
public class CustomExceptionMiddleware
{
    public async Task InvokeAsync(HttpContext context)
    {
        try
        {
            await _next(context);
        }
        catch (ExcecaoNegocio ex)
        {
            context.Response.StatusCode = 400;
            await context.Response.WriteAsJsonAsync(new
            {
                ex.Message,
                ex.CodigoErro,
                Detalhes = ex.StackTrace // Em desenvolvimento
            });
        }
    }
}

Resposta da API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real.:

{
  "Message": "Pagamento recusado: saldo insuficiente",
  "CodigoErro": "PAGAMENTO_001",
  "Detalhes": "..."
}

Conclusão🔗

Exceções customizadas💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. são como bilhetes escritos à mão para avisar que algo deu errado de uma forma que só o seu negócio entende. Com elas, você ganha clareza no código e facilita a correção de bugs - tudo isso falando a língua da sua aplicação. Use essa abordagem sempre que uma exceção pré-existente não for suficiente para expressar corretamente o problema, mas fique de olho para não sair criando exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. desnecessárias. A ideia é manter o fluxo de erros claro, produtivo e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. focado em resolver os desafios do seu sistema. Boa criação de exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. e até a próxima!

🛠 Casos de Uso Reais🔗

1. Integrações externas:

throw new IntegracaoPagamentoException("API PagSeguro offline", codigo: 503);

2. Regras de negócio complexas:

if (idade < 18 && valor > 1000)
    throw new LimiteMenorIdadeException(idade, valor);

3. Logging📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!📝 Logging com Serilog: Registre Tudo como um Detetive de Bugs!Aprenda a usar Serilog em .NET para registrar logs estruturados, identificar erros e enriquecer informações, transformando seu código num enigma solucionável. enriquecido:

logger.LogError(ex, "Erro ao processar pedido {PedidoId}", ex.PedidoId);

Dominar exceções customizadas💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código. é como ter um sistema de diagnóstico médico especializado para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! sua aplicação. Cada erro conta uma história rica em detalhes, acelerando a solução de problemas e melhorando a comunicação entre devs e stakeholders. 🩺💻

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados