Como Usa o Try.. catch..finally

:?: Alguem pode me explicar como eh q usa direitnho esse tal de try …catch/ try…finally.

so sei q serve para o tratamnetode exceçoes.

por favor me ajudem… meu professor naum sabe nada de java so faz enrolar + a gente

Entao, o jeito eh aprender Java sozinho :smiley:

Pegue uns bons tutoriais (dica: aqui no GUJ tem uma quantidade bem razoavel deles ;)), um livro, e mande ver.

Apesar disso… try…catch … finally é uma questão mais delicada .
Veja a questão que o Paulo já abriu…

http://www.guj.com.br/forum/viewtopic.php?t=6319&highlight=finally

Bom respondendo para o Paulo e também para vc Bruno:

[code]

BufferedReader = null;

try {
// cria reader, processa arquivo e tudomais
}
catch (Exception e) {
// oooops
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (Exception e) {
// outro ooops
}
}
} [/code]

este finally é inseparável do block “try catch finally”, porque ele só faz sentindo dentro deste contexto. A idéia é que quando vc copiar/mover/fazer o diabo com este trecho do código, vc vai levar junto este código finally.

Finally não é o código que segue o try…catch mas é tudo que precisa ser feito após ele. O que vc abriu, vc deve fechar, senão vc ainda vai ver uma mensagem de erro assim…
“eu fechei esta sessão, mas você deveria sempre fechar as sessões” (recebi esta mensagem do jboss, porque eu não fechei uma session Bean quando uma exceção fora lançada).


Para o Bruno
try … catch … finally é o seguinte.
Ao invés de vc receber de um método um valor que representa um código de erro, o método lança uma exceção. Por ele lançar exceção, vc precisa dar um surround ou lançar a exceção denovo.

Como fazer um Surround:

public void myMethod() {
b.open;
try {
     A a = b.read(); // b lança exception
} cath (Exception e) {
   // imprimindo o erro;
   e.printStackTrace(); // ou coisa do gênero...nao lembro
   // decidi que devo finalizar o programa por causa do erro
    System.exit(-1);
} finally {
   b.close(); 
}
}

Throwing

public void myMethod () throws Exception {
b.open;
A a = b.read(); // to nem ai se ocorreu uma exception, se alguém 
// chamar este método, que trate a exceção 
b.close();
}
1 curtida

Vou tentar te explicar de maneira mais simples

Dentro do bloco de código pertencente ao try a gente põe um código de risco, algo que possa gerar uma exceção, no catch a gente pode tratar essa exceção, se o bloco try executar seus comandos perfeitamente o bloco catch não é chamado, só é chamado quando ocorre uma exceção dentro do bloco try, e o bloco finally, ocorre independente se o bloco try gera alguma axceção ou não, vem logo após o bloco catch

2 curtidas

Mas qual seria a importância do finally sendo que posso excutar outras coisas depois do catch…

try{
 //lero lero
}catch(Exception ex){
 //ihh.. não funcionou
}finally{
 //fazer algo no finally...
}
//fazer a mesma coisa que no finally...

[quote=heliob]Mas qual seria a importância do finally sendo que posso excutar outras coisas depois do catch…

try{ //lero lero }catch(Exception ex){ //ihh.. não funcionou }finally{ //fazer algo no finally... } //fazer a mesma coisa que no finally... [/quote]

Toda uma importância. Um exemplo que eu fiz e uso aqui no projeto em que trabalho, é que realizo o login via request antes de dar continuidade ao processo. Mas no finaly é onde eu realizo o logout. Porque ? Simplesmente porque eu posso logar e a exceção ser gerado após isso, em meio a todo o processo. Se eu fizer o logout no catch, terei que fazer fora dele também, porque como fica se não ocorre nenhuma exceção ?

O finaly me garante que independente do que aconteça naquela instrução, eu sempre irei realizar o logout. Esse exemplo é muito visto quando se trabalhar com IO, leitura/gravação de arquivos. O correto é fechar os streams no finaly, por n motivos.

2 curtidas

bom… Nel eu não entendi… Estou estudando java, talvez quando tiver algo relacionado a acessar banco de dados eu entenda melhor…

Mas esse logout vc não poderia fazer fora do finally?

Tipo:

bool lg;
try{

lg = login();

}catch(Exception ex ){
 System.out.println("melou...");
}

if(!lg){
 logout();
}

Considere o caso de haver um return dentro do try:

try { //Código 1 return xyz; } catch (Exception e) { //Código 2 } finally { //Código 3 } //Codigo 4

Note que o finally será executado mesmo que o código 1, que está no try rode corretamente, e atinja o return.
Essa situação não executará após o finally.

Em caso de sucesso, a execução seria:
Codigo1
Return
Codigo3
Sai da função.

Em caso de falha:
Codigo1
Codigo2
Codigo3
Codigo4
Sai da função.

O finally sempre roda. Use-o fazer coisas que deveriam ser executadas sempre caso dê certo, caso de erro, e antes da função cair fora. Por exemplo, fechar arquivos e sockets.

No caso do Java 7, o try with resources elimina a necessidade do finally para essas situações.

1 curtida

[quote=heliob]bom… Nel eu não entendi… Estou estudando java, talvez quando tiver algo relacionado a acessar banco de dados eu entenda melhor…

Mas esse logout vc não poderia fazer fora do finally?

Tipo:

bool lg;
try{

lg = login();

}catch(Exception ex ){
 System.out.println("melou...");
}

if(!lg){
 logout();
}

[/quote]

Entendeu a explicação do ViniGodoy ? No meu caso, é o “código 1”, nele mesmo já realizo o return. Uso o bloco finaly para garantir a execução do método e o mesmo vale para quando cai no catch, pois existe um tratamento de exceção que o sistema faz.

agora sim…
então seria no caso de return ou lançar uma exceção dentro de try ou catch…

ah… beleza…

Abraços,
Hélio

O try, catch e finally são utilizados quando necessita executar determinada tarefa que possa
ter um erro sendo que a expressão catch é para o tratamento do erro e o finally o que vc deseja
fazer após o tratamento do erro, caso não tenha isto o usuário poderá ser surpreendido com telas
de erros absurdos tornando sua aplicação menos confiável e menos segura devido a revelar possíveis
vulnerabilidades.

Amigos, esse post é de 2004, ou eu olhei errado? :roll: