Exceções

12 respostas
E

quando tenho um método que utiliza outras classes que podem gerar exceções é melhor tratar ou repassar para quem chamou?

12 Respostas

Hempx

Acho que depende…
Mas eu particulamente acho que fica mais claro você tratar logo a exeção.
Você fica repassando só aumenta digitação e a complicação do código.

Rafael_Steil

Pelo contrario. Repassar a exception eh menos codigo. Ao inves de fazer

...
try {
    // codigo
}
catch (AlgumaException e) {
    // tratamento
}
...

vc simplesmnete faz

public void meuMetodo() throws AlgumaException
{
    // codigo
}
...

e trata as exception em um unico try-catch ( no controller, por exemplo ).

Melhor ou pior? ai depende de voce. Eu prefiro a segunda forma, ha tem defenda a primeira.

Rafael

V

Eu acho que depende muito do caso

só faz sentido passar pra frente se for o escopo do metodo, agora se for algo que é excutado somente internamente e a excessão é de interese somente do metodo é melhor tratar internamente

É claro que essa é a minha opinião, vale a pena esperar e verificar a resposta de pessoas com muito mais experiência do que eu.

Luca

Olá

Se for por votaçãO voto com vegeto. Mas pensando bem, em muitos casos meu voto iria para o Rafael. Conclusão: não há regra fixa, cada caso é um caso. E ainda bem que é assim, senão qualquer máquina sairia programando e a gente iria vender pastel na feira.

Programar computadores é uma tarefa completamente subjetiva e ao contrário que a turma de humanas pensa, é bastante criativa. Escolher o caminho a gente faz baseado na experiência com as melhores práticas , na intuição e até no humor do dia (principalmente do chefe). Daí as vezes a gente relê nosso código tempos depois e sente uma vontade danada de melhorar um pouquinho. Isto é uma das piores práticas. Depois que fechamos os testes unitários e integramos nosso código, deve haver um bom motivo para refatorar, nunca só por estética ou elegância.

[]s
Luca

cv1

Tratamento de excecoes é SEMPRE um tópico polêmico, e que nao tem uma única resposta precisa e genérica pra acabar com a discussão.

Das que eu li até hoje, a que mais se aproximou disso foi uma frase meio vaga, “trate exceções onde elas devem ser tratadas”. É tão vaga, e responte tão mal a pergunta, que eu me sinto meio que na obrigação de contar um causo.

Seguinte: eu tinha acabado de começar a programar em Java, e, vindo do C++, eu achava checked exceptions as coisas mais chatas do mundo (“ter que ser obrigado a tratar ou lançar uma exception!? QUE SACO!”). Um pouco de tempo depois, começou a fazer sentido: se o erro tem uma probabilidade grande de acontecer, entao pq nao diabos se preparar pra tratar ele? IOExceptions e SQLExceptions sao um caso bem comum aqui.

Se voce esta lendo um arquivo, entao eh bom mesmo vc se preparar pra tomar um erro a qqer momento, pq afinal, fazer um arquivo desaparecer ou acabar antes do que devia é a coisa mais fácil que tem, e nem precisaria ser muito engenhoso pra detonar um sistema desse jeito. Mesma coisa pras SQLExceptions. Se a comunicação com o DB deu pau, entao eh 50% de chance de vc nao conseguir se recuperar, e tem que mostrar o erro pro usuario de algum jeito. Mas e os outros 50%?

É nessa hora que o problema começa. Quando eu estava iniciando em Java, eu simplesmente deixava a exception propagar atéééééé a camada mais rasinha do sistema, e tacava um stack trace na cara do coitado do usuário. Prático, mas nada, nada robusto.

Depois disso, a minha 2a melhor idéia foi “esconder” exceptions. Nada de throws SQLException, quando eu poida encapsular as excecoes em outras, com nomes mais genericos, como ClienteException, e dai sim propagar a coisa pra cima e pra baixo. No final, acabava que TechnicalException encapsula DAOException, que encapsula SQLException. Advinha o que acontecia quando eu tentava entender o que tava escrito em algum stack trace? :smiley:

A 3a ideia foi parar pra pensar direito onde e quando usar excecoes checadas (“eu posso continuar se acontecer isso?”) e quando usar excecoes nao checadas (“isso NUNCA devia acontecer na execucao normal do programa, e eu nao tenho como me livrar desse erro”). E eh essa que tem funcionado bem ate hoje. Ainda bem, senao era melhor mesmo eu ter ido vender pastel na feira :smiley:

PS: pensando bem, se eu vendesse pastel na feira eu ia acabar nao conseguindo trabalhar, pq eu ia comer toda a producao. Oops…

Bani

O livro Effective Java tem um capítulo inteiro dedicado a exceções.
Os itens 43 e 46 de certa forma abordam essa questão de como tratar a exceção em cada nível.
Se alguém quiser ler meu resumo deste capítulo, está aqui.

louds

O scott meyers nos livros dele de C++ faz um tratado muito bom sobre tratamento de excessões.

O maior problema do java, ao meu ver, é que o modelo de tratamento é incompleto. Voce não tem como escrever um método que simplesmente e dizer pro compilador “esse método não sabe tratar excessões, passe tudo adiante” e ele fazer o trabalho sujo de incluir todas declarações de throws para mim; qualquer ide te faz isso, mas eu não gosto ter 1 página entre a declaração do método e a primeira linha da implementação. Alem disso não existe suporte a uma clausula genérica de catch que não te obrigue a fazer uma gambiarra para propagar a exception.

cv1

Se vc tem uma página entre a declaração do método e a primeira linha da implementação, o problema nao sao as exceptions :wink:

V

Eu achei esse artigo interessante que fala sobre checked exceptions e runtime exceptions

um trecho importante que o autor fala


As a rule of thumb, you should always catch a checked exception once you reach a point where your code can make a meaningful attempt at recovery. However, it is best not to catch runtime exceptions. Instead, you should allow runtime exceptions to bubble up to where you can see them.

E

poucas vezes não tive que repassar exceções. Para mim se algo fora do normal aconteceu o objeto tem avisar.

Rafael_Steil

Vale uma lida:


Rafael

chcl

Esse lance de tratamento de exceções é osso viu bacana o artigo da javaworld! Esse lance de repassar excecao é foda quando o escopo disso é muito longo fica um saco pra manipular e tratar essas porra! so mais tratar logo de uma vez!

Criado 6 de janeiro de 2004
Ultima resposta 7 de jan. de 2004
Respostas 12
Participantes 9