Oi, eu uso Java e eu nunca aprendi na graduação quando usar Try Catch ou Throws SQL… então eu uso Throws… em todos os métodos! Qual a diferença ? E eu posso continuar usando ?
Vou dar um exemplo usando IOException
ao invés de SQLException
porque o conceito é o mesmo.
Se vc não usar try/catch, seu programa é interrompido assim que uma exceção
ocorre.
No exemplo abaixo eu estou tentando ler o conteúdo de um arquivo de texto que não existe e isso vai causar uma exceção. Note como a mensagem “FIM” não é impressa, demonstrando que o programa foi encerrado antes do esperado.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class App1 {
public static void main(String... args) throws IOException {
System.out.println("INICIO");
System.out.println(Files.readString(Path.of("xxx")));
System.out.println("FIM");
}
}
Algumas vezes este é exatamente o comportamento que vc deseja. Talvez, para o seu programa, não faça sentido continuar uma vez que o arquivo desejado não existe e vc não se importa de mostrar para o usuário o stacktrace.
Porém, pode ser mais útil informar ao usuário o que exatamente ocorreu, nestes casos vc pode usar o try/catch.
Veja no exemplo abaixo como a mensagem de erro aparece e logo em seguida a mensagem “FIM” é impressa. Isso quer dizer que seu programa encontrou um erro, deu uma breve satisfação ao usuário sobre o que ocorreu e, em seguida, finalizou normalmente.
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class App2 {
public static void main(String... args) {
System.out.println("INICIO");
try {
System.out.println(Files.readString(Path.of("xxx")));
} catch (IOException e) {
System.out.println("O arquivo desejado não existe ou não pode ser lido: " + e.getMessage());
}
System.out.println("FIM");
}
}
Vc pode continuar usando throws
enquanto ele estiver satisfazendo suas necessidades.
Conforme seu programa for evoluindo e a necessidade de um controle maior das exceção surgir, vc vai ter começar a tratar estas exceções usando try/catch.
Você tem que analisar de quem é a responsabilidade de tratar a exceção.
Se a responsabilidade for do próprio método que você está escrevendo, então você usa try - catch
.
Se a responsabilidade for de quem for usar o seu método, então você usa o throws
.
Basicamente então o Try Catch iria informar o erro que ocorreu “Dizendo oque ocasionou o erro” e o throws só vai interromper sem dar o motivo e bola para frente ?
Não.
O que interropompe o fluxo normal do programa é quando a exceção é lançada.
Diante do lançamento de uma exceção vc tem 2 opções:
-
Usar try/catch para capturar a exceção e realizar alguma ação. Essa ação poderia ser mostrar uma mensagem pro usuário, mas pode ser qualquer outro tipo de coisa.
-
Adicionar o
throws
na assinatura do método. Othrows
serve apenas para indicar que aquele método pode lançar aquela exceção. Quando vc faz isso, vc está passando a responsabilidade do tratamento da exceção para o contexto que chama o método comthrows
. E é como o Staroski disse, vc tem que analisar para ver se faz sentido transferir esta responsabilidade.
Você manja demais homem