6
respostas

Dúvida - Aula 6 - Exceções e Controle de Erros

Pessoal, Não consegui entender a explicação do vídeo e nem a explicação em texto.

Até então, todas as condições eram testadas principalmente com os ifs e eu não consegui assimilar e aplicar exceptions/ try/ catch, porque na minha cabeça eu já poderia retornar uma sinalização de erro apenas com os if's.

Alguém poderia tentar me explicar de outra forma ou indicar algum material para leitura? Senti muita dificuldade nesse assunto.

6 respostas

As exceptions/try/catch são usadas para tratar os erros que o sistema gera como por exemplo:

Um cálculo que por um acaso tenha uma divisão por zero, com if's você não conseguiria resolver este problema, pois o sistema jogaria o erro de execução para o usuário, se você estivesse executando este comando dentro de um try/catch tratando o erro de maneira correta, o programa poderia seguir eexecutando normalmente.

Olá Lucas, tudo bem?

Acho que o que não deve ter ficado muito claro pra você é a diferença entre condição e exceção. Uma condição é algo que variavelmente pode acontecer ou não em seu código, fazendo com que voce decida o que fazer caso aquela condição ocorra ou não. Faz parte da lógica de negócio do seu sistema. No caso de exceções , ela afetaria a continuidade do funcionamento do seu código, ou seja, são tipos especiais de condições que obrigatoriamente devem ser tratadas(checked) ou não(unchecked). Então, a maioria das linguagens de programação faz uso de exceções para lidar com este tipo especial de condição. Como explicado na aula, apenas as exceções unchecked em 99% dos casos não precisam ser tratadas obrigatóriamente, já que são exceções que não conseguimos resolver dentro do escopo do software, como queda de energia ou alguma falha de hardware. Nestes casos, quando elas ocorrem o programa termina e o máximo que podemos fazer é registrar o ocorrido em logs, para que alguma ação externa seja tomada para resolver o problema.

Bom dia

Você pode até tentar tratar um erro com o uso de IFs, mas você tem que ter em mente que, o IF, é a representação de uma condição, então ele executará um código se a condição que foi passada como parâmetro for verdadeira, caso não seja, é executado o ELSE. Diferentemente do TRY/CATCH aonde o código dentro do TRY não precisa de uma condição, este código será executado independente, ele só cairá no CATCH, se, por acaso, houver algum.

Explicado um pouco sobre as duas condições, voltamos ao exemplo anterior:

int[] array = new int[10]
for (int i = 0; i <= 15; i++) {
            array[i] = i;
            System.out.println(i);
        }

Qual o erro forçado no código acima? O array, quando percorrido, irá exceder o limite do índice, fazendo com que o compilador detecte o erro, mas se você executar este código da maneira que esta, ele retornará uma mensagem citando o erro que acabei de mencionar.

Qual a função do TRY/CATCH? Tratar o erro de uma maneira que, mesmo havendo este erro, não pare a execução do programa inteiro:

int[] array = new int[10]
try {
    for (int i = 0; i <= 15; i++) {
                array[i] = i;
                System.out.println(i);
            }
} catch (Exception e) {
    System.out.println("Erro: " e.getMessage());
}

O que acontece agora? Ele tentar (try) executar o código do FOR, se, por acaso houver uma exceção (exception), ele pega (catch) esta exceção e executa o código presente no escopo, no caso o código do CATCH.

Eu entendo o motivo de você pensar em tratamento de erro usando o IF/ELSE, pelo simples motivo de pensarmos:

SE (alguma coisa) {
    executa este código
} SENÃO {
    executa este outro código
}

Já o TRY/CATCH é:

TENTA {
    executa o código
} PEGA (EXCEÇÃO) {
    executa este outro código
}

Não sou um bom programador JAVA, estou iniciando, mas espero ter ajudado.

Pra simplificar a coisa, se você usar uma validação booleana, por exemplo e tratar o seu método com if's, qualquer um que chamar seu método terá de fazer a mesma coisa, mas pode ser que quem o chame não saiba disso, ou passe desapercebido. No caso das exceptions isso não acontecerá pois, ou o seu método trata a exceção, não deixando ela continuar, ou quem chamar o seu método sempre receberá uma notificação da IDE de que deve tratar uma exceção.

O try tenta executar uma parte do código, se der certo ele continua, se der errado ele cai dentro do catch.

Olá, não sei se vou conseguir te explicar direito, mas quando você trata um erro com IF's, você estará tratando erros que você imaginou que fossem ocorrer, por exemplo:

if (i == 0){
    i = 1
}
valor = a / i;

Mas até mesmo esse tipo de erro em alguns casos não são previstos. Por exemplo, imagine que você vai criar uma função que irá executar uma query no banco de dados. Você não pode imaginar qual erro que vai dar na execução dessa query, mas você precisa tratar, caos contrario irá aparecer um erro absurdo para o usuário e em alguns casos expondo dados que ele não deveria ficar sabendo, como nomes de colunas e tabelas. Para isso você utiliza o try\catch.

try{
    executa_query(querySql);
} catch (SQLException e){
     System.out.println("Erro ao executar a query");
}

Espero ter ajuda um pouco.