Eu estou evitando utilizar throws para não precisar usar try/catch mais pra frente, porém… fica uma coisa de outro mundo o código, com o monte de try/catch que aparece…
na opinião de vocês, ONDE, QUANDO E PQ usar throws invéz de try ou vice versa?
Try/catch/finalize = quando a classe for responsável por tratar o dito erro. Se o erro pode ser tratado mais para frente de uma maneira mais comum ao projeto, não utilizo. Ex.: Formatar objetos
Throws = quando o erro não for de responsabilidade da classe, que simplesmente executa e qualquer erro seja tratado mais adequadamente em uma classe própria para isso. Ex.: Acessar de várias maneiras um servidor (seja via sockets ou um post ao servlet), se um falha, joga a exception para frente, tenta da outra maneira e trabalha com o erro gerado.
Têm vezes que RuntimeException deve ser tratado, imagina se num programa de compensação seu, por algum problema de dados do banco ou outro, lança uma ArithmeticException ( divisão por zero dá isso ) ?
Exceptions possivelmente perigosas têm sim que serem tratadas, mesmo unchecked.
quando vc ta afim de passar o problema para alguem… mas lembre-se uma hora alguem tem q tratar o problema gerado… ao desenrolar da pilha… alguem vai ter q capturar e tratar… senao a bomba vai ser lançada para o usuario…
[quote=ricardo.ekm]É relativamente simples.
Se você sabe tratar o problema cate a exceção com try/catch. Se não souber passe para cima.[/quote]
ahn? :shock:
como foi dito antes… vai depender da classe onde está, o tipo de erro e onde você vai querer tratá-lo.
exemplo simples é uma classe contendo regras de negócios onde se por algum acaso a cominicaçao do banco falhar deixe que a classe do banco se encarregue do erro, mas se não chegou um campo que erá pra estar preenchido… trate ela.
[quote=jingle][quote=ricardo.ekm]É relativamente simples.
Se você sabe tratar o problema cate a exceção com try/catch. Se não souber passe para cima.[/quote]
ahn? :shock:
como foi dito antes… vai depender da classe onde está, o tipo de erro e onde você vai querer tratá-lo.
exemplo simples é uma classe contendo regras de negócios onde se por algum acaso a cominicaçao do banco falhar deixe que a classe do banco se encarregue do erro, mas se não chegou um campo que erá pra estar preenchido… trate ela.[/quote]
Ele quis dizer que se você não quiser tratar a exceção (usando try/catch/finalize e apresentando uma mensagem de erro dentro dos catchs), você pode se desviar dela. Eu não entendi muito bem quando li, mas acho bom sempre tratar, afinal, se você sempre “passar pra cima”, vai estourar em algum lugar.
Li em algum blog que não é legal fazer muitas exceções. O porquê? Também não entendi…
Respondendo ao tópico,
Eu acho que try/catch/finalize você usa dentro do método que tem um comportamento arriscado e o throws você usa no método que está chamando ométodo que tem o comportamento arriscado (aliás, não dá pra confundir throws com throw, coisa que eu sempre faço).
Eu geralmente uso try/catch somente nas telas. Porque daí eu posso mostrar o erro ao usuário (a não ser que o erro seja daquele “macabros”, que o usuário possa se assustar. ). Quando é nas classes mais internas eu lanço sempre, para a lógica não ficar muito confusa, com vários tratamentos no meio…
Deixe-me detalhar melhor o que falei então.
Aconteceu uma exceção e sua classe não sabe o que fazer com ela. nesse caso repasse a exceção através de throws. Você não tem como se recuperar da exceção ou não sabe tratá-la então não tem o que fazer, sua única alternativa é repassar. Um try catch vazio é na maioria dos casos um anti-pattern. Para mais sobre isso pesquisar sobre swallow exception.
Se ninguém souber tratar vai subir até o topo da pilha na qual é recomendável um try/catch global, e dependendo do software você loga, exibe mensagem para o usuário, faz um clean-up geral etc e depois fecha o aplicativo, pois é perigoso continuar sendo que aconteceu algo que você não sabe se recuperar ou tratar.
Em sistemas grandes é bom ter um try/catch global para cada subsistema assim caso aconteça alguma falha em um deles os outros continuam funcionando.
[quote=jingle][quote=ricardo.ekm]É relativamente simples.
Se você sabe tratar o problema cate a exceção com try/catch. Se não souber passe para cima.[/quote]
ahn? :shock:
como foi dito antes… vai depender da classe onde está, o tipo de erro e onde você vai querer tratá-lo.
exemplo simples é uma classe contendo regras de negócios onde se por algum acaso a cominicaçao do banco falhar deixe que a classe do banco se encarregue do erro, mas se não chegou um campo que erá pra estar preenchido… trate ela.[/quote]
O que a classe do banco deve fazer se a comunicação com o banco falhar?