quando encontramos um possível erro, o envolvo num try-catch, qual a diferença de eu colocar um “throw new Exception()” dentro do try ou tratar dentro do catch.
entendi bem apenas que ao acontecer o erro, essa linha errada de código é ignorada ea tread pula para dentro do catch, certo?!
O bloco try catch, serve para tratar as exceções. (ponto)
O throw serve para lançar uma exceção, geralmente é usado para lançar uma exceção personalizada, ou para relançar a exceção capturada para outra camada de sua aplicação, que por sua vez, tbm terá de tratar esta exceção.
lançar essa excessão significa pegar o erro e impedir que trave a aplicação?
estava fazendo um teste, tentando deixar de várias formas possíveis e não consegui compreender por completo essas diferenças.
criando seja lá onde for um throw new Exception, tenho a opção de por uma mensagem( new Exception(mensagem) ) mas não tenho onde visualizar essa mensagem, pelo menos não encontrei, pois no console do netbeans não aparece, então me perguntei, pq colocar uma mensagem personalizada ali se não consigo exibir?
já dentro do cathc posso colocar uma tela exibindo “excessao.getMessage()”.
Lançar a exceção significa TRAVAR a aplicação !
Muita coisa no java lança exceções! Vc tem os erros, pq alguém lançou a exceção!
E para isso existe o bloco try catch. Para tratar estas exceções!
Não é um melhor q o outro. Cada um serve para uma coisa !
O throw lança a exceção e o catch captura! O try serve para vc colocar seu código q possivelmente lançará a exceção!
até um ponto eu dominei,
no try vc coloca o que quer proteger.
no catch vc faz alguma coisa para caso aconteça um erro.
mas colocar o tal do throw dentro do try é q n entendi bem a necessidade…
Issoo … é isso mesmo !!
Então,
um exemplo clássico do pq usar o throw seria para fazer uma validação.
try {
if (email.lenght() > 50) {
throw new Exception("campo deve ser menor que 50 caracteres");
} else {
System.out.println("Email: " + email);
}
} catch (Exception e) {
System.out.println("Email inválido: " + e.getMessage());
}
Mas tbm, se for pensar em uma aplicação com várias camadas, vc pode lançar alguma exceção personalizada para a outra camada, por exemplo:
// ClasseDAO
public void save(entidade) {
try {
if (entidade.getId() != null) {
entityManager.update(entidade);
} else {
entityManager.persist(entidade);
}
} catch(Exception e) {
entityManager.getTransaction().rollback();
throw new DAOException(e.getMessage());
}
}
// Agora vamos usar este dao em outra Classe
ClasseDAO dao = new ClasseDAO();
try {
dao.save(cliente);
} catch (DAOException e) {
exibirMensagemDeErro(e.getMessage());
}
no primeiro quadro:
faz se um teste, se email maior que 50 caracteres lança uma Exception() (para que esa mensagem como parâmetro na exception? )
e pula para o catch ? pq se pular, sei q vai aparecer no console a msg de erro.
o if-else testa “simulando” um erro, entra no if e lança a excessão, o que acontece agora nesse caso? é o nde eu travo e não consegui identificar exatamente o q tá fazendo esse throw ai…
try { // Tente isso ...
if (email.lenght() > 50) { // Se o email for maior que 50
throw new Exception("campo deve ser menor que 50 caracteres");// Lança uma exceção com a descrição do erro (alguém vai ter q tratar este erro);
} else { // Se o email não for maior que 50
System.out.println("Email: " + email); // Simplesmente imprime o email na tela(passou na validação, está correto o email)
} // Agora q vem o pulo do gato
} catch (Exception e) { // Capture alguma exceção q foi lançada anteriormente (com isso, no momento em q foi dado
// o throw ele vem pra cá sem terminar o resto do código dentro do try)
System.out.println("Email inválido: " + e.getMessage()); // O tratamento dado pelo erro é de imprimir na tela que o email está inválido e
// seguido do tipo de problema q deu (setado anteriormente ao dar o new Exception(message))
}
Com o tempo vc se acostuma. O tratamento de exceções é uma parte muito importante do java! E tbm é uma das mais difíceis pra qm está começando.
Sugiro uma apostila de java básico da caelum.
http://www.caelum.com.br/download/caelum-java-objetos-fj11.pdf
oi pessoal, bom ida.
vou dar uma lida nas sugestões e ja volto, vlw!
li a nota no blog da caelum.
excessão checked é quando você tem que tratar na hora, por exemplo, vc cria uma classe e a ide te obriga a criar um try-catch ou um throws?
excessão unchecked é quando existe a possibilidade de erro mas só é possível constatar em tempo de execução?
é o que quer dizer abaixo(retirado do blog)? - eu não deveria pensar em tratar agora , mas só quando estiver executando? como saber se ao menos o banco existe né?!?!
dentro do catch acima, foi escrito: throw new AcessoADadosException(“Problema na criação do Statement”, e);
para onde vai esse throw? se ele não estivesse alí, qual a diferença?
pessoal, não é preguiça de ler não tá… eu estudo(mesmo q vagarosamente.rs), só o Sr Google não tá ajudando.
falta de prática tb ajuda , mas to indo ladeira abaixo(rs) não vou parar mais…(nem no muro.
tratando com o try catch quer dizer que :::
eu encontrei o erro e sei resolver este tipo de erro, então resolvo dentro do catch.
lançando com o throw quer dizer::::
eu encontrei o erro, mas nao sei qual o tratamento que devo dar a este erro, então vou enviar ( lançar ) para que quem usar a minha classe que dea o tratamento correcto ao erro.
exemplo pratico
[quote=daquinho]quando encontramos um possível erro, o envolvo num try-catch, qual a diferença de eu colocar um “throw new Exception()” dentro do try ou tratar dentro do catch.
entendi bem apenas que ao acontecer o erro, essa linha errada de código é ignorada ea tread pula para dentro do catch, certo?![/quote]
Opa… consegui entender.
quando se faz um throw new Exception(), se deve(ajuda) por uma mensagem, pois quando for capturado essa excessão, a mensagem posta dentro da classe de excessão será exibida quando esse erro acontecer.
o throw sempre tem que ficar logo abaixo do possível erro?
se tem try, tem catch acompanhando, se o q tem dentro do try dá erro, pula para dentro do catch e executa o q tem lá dentro. se obrigatóriamente vou para o catch, para que o throw dentro do try? dentro do catch já não tem como eu exibir várias mensagens, da classe de excessão descrita na assinatura do catch?
Você usa o throw para lançar uma exceção, então o mais normal é que após detectado o erro, se lance a exceção. Mas também não é necessário ter o try/catch para poder lançar a exceção. Por exemplo:
public void setIdade(int idade) { // Este método recebe um inteiro com a idade do pião.
if (idade < 0) { // Não existe pessoas com idade negativa, portanto verificamos em um if se a idade é menor que zero.
throw new IllegalArgumentException("A idade não pode ser negativa"); // Se a idade for negativa, significa que o parâmetro passado não é válido, então lançamos uma exceção. O responsável por tratar esta exceção é aquele que chama este método.
} // Se tudo estiver nos conformes, continua a execução do método.
this.idade = idade;
}
Não necessariamente, posso colocar o try apenas com um finally.
try {
// faz alguma coisa...
} finally {
// fecha o que tiver que fechar...
}
Você pode ter um catch para tratar um tipo de exceção e ainda assim lançar um outro tipo de exceção para ser tratada posteriormente ou travar seu programa.
try {
// faz alguma coisa que lança IOException, por exemplo.
// Dependendo do que ocorrer em determinada parte do seu método, lança um RuntimeException, que não será capturado no catch, pois não é um IOException.
} catch (IOException e) {
// trata apenas o que for IOException.
}
caramba, quantas formas de se tratar excessões …
então posso dividir a responsabilidade quando tenho mais de uma excessão, em várias catch’s e/ou passa uma ou várias delas por throws.
posso fazer try-catch
posso substituir try-catch por if-else lançando um throw que simula um throws(ou mais ou menos isso)
qual seria uma vantagem para lançar uma excessão por if com um throw, ao invés de try-catch? estou certo em afirmar q ao usar if-else, estou forçando a excessão a ser passada aquem chamou o método?(condição né!! entrou no if tem q ser executada) pq se pegar a excessão o throw vai ser passado memso para quem chamou…
pessoal, estou só tentando confirmar as idéias q capturei e confirmar também as opções existentes, facilidades, prioridades e a melhor opção para cada situação. quanto mais opções mais problemas , mais informações pra buscar… mais dúvidas, mais soluções, mais dúvidas e mais soluções e etc…rs