Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Por que usar Exceptions?

Oi pessoal, entendi o em que momento é feito o uso mas não entendi o por que de se usar os métodos try e catch e criar classes derivadas do exceptions se você pode tratar os "erros" do usuário com if's e messagebox? Existe alguma vantagem além de organização do código? o/

4 respostas

O uso de exceptions permite: 1) impedir a parada de execução prematura do código, 2) capturar o erro/exceção e 3) delegar o tratamento deste erro para alguma parte específica do código (classe).

Fazer isto somente com IF e messabox é inviável.

Além disto, esta abordagem permite a criação de classes especializadas em tratar erros específicos. Desta forma, o código fica mais legível e mais fácil de manter.

Por exemplo, posso ter uma classe especializada em tratar erros de banco de dados, outra para tratar erros de envio de emails, outra para tratar problemas de impressão, outra para tratar problemas de permissões, etc.

Oi José, tudo bom?

O problema do if, é que ele não te da a possibilidade de controlar o fluxo do seu sistema. Com as exceções a gente decide se o sistema continua ou não.

Com o if a gente precisa lembrar de fazer a validação, com a exception mesmo que ninguém faça o tratamento try/catch nossa regra vai ser respeitada e o sistema para.

Qualquer duvida, fala com a gente!

Abraço =)

Obrigado pessoal,

André - "Com o if a gente precisa lembrar de fazer a validação, com a exception mesmo que ninguém faça o tratamento try/catch nossa regra vai ser respeitada e o sistema para."

Isso significa que se eu criar uma classe de exception e não fizer o try/catch o erro será tratado do mesmo jeito?

Ainda não consegui ver um benefício tão grande assim já que o tempo de criar uma classe pra erro e um if pra checar um possível erro é o mesmo... talvez quando eu pegar sistemas mais complexos comece a fazer mais sentido.

Abraço!

solução!

Não significa que o erro será tratado, mas que sua regra será respeitada (nem que isso significa parar o sistema).

Pensando, por exemplo, em um caixa eletronico. Após realizar o saque de uma conta, precisamos emitir as notas. Se nosso método saca retornar um boolean para verificação:

Conta c1 = new Conta();
c1.Deposita(200);

double valor = 300.0;
c1.Saca(valor); // retorna false

Caixa.Emite(valor);// O caixa emite as notas do mesmo jeito

Aqui, se estivessemos trabalhando com exceção, nosso sistema pararia na chamada do método Saca. Logo, o método Caixa.Emite() não seria chamado:

Conta c1 = new Conta();
c1.Deposita(200);

double valor = 300.0;
c1.Saca(valor); // Lança a exceção!

Caixa.Emite(valor);// Não chega nessa linha

Nesse caso, o que precisariamos lembrar de fazer é a verificação:

Conta c1 = new Conta();
c1.Deposita(200);

double valor = 300.0;
if(c1.Saca(valor)){
    Caixa.Emite(valor);
}

Repare que nem todo mundo que pegar esse sistema vai saber o que o método saca devolve. Nem todo mundo vai lembrar de fazer a verificação.

Com exception evitamos todos esses problemas. Além de ganhar na representação e semantica =)

Quando nossa exceção for lançada (e não tratada) a gente sabe exatamente o que aconteceu pois o stack trace vai indicar exatamente em qual classe ocorreu o erro e também qual linha! Além disso também temos o nome da exceção que ajuda. No nosso caso seria algo como SaldoInsuficienteException.

Ou seja, quando formos olhar esse código, sabemos a classe, a linha e qual o problema.

Sabendo que esse código lança uma exceção, não somos obrigados a deixar o sistema parar, certo? A gente pode tentar executar o Saca, caso de errado a gente pega a exceção:

Conta c1 = new Conta();
c1.Deposita(200);

double valor = 300.0;
try
{
    c1.Saca(valor); // se a exceção for lançada aqui, a proxima linha não é executada e caimos na lógica de tratamento do erro!
    Caixa.Emite(valor);
}
catch(SaldoInsuficienteException e)
{
    MessageBox.Show("Você não possui saldo suficiente na conta");
}

Espero que ter ajudado a esclarecer =)

Abraço e bons estudos!