1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Tratamento de Exceptions Java

Olá!

Sou programador treine estudando para certificação OCP 7 Java SE Programmer, fiz a leitura do livro Java How to Program 9 Edition Paul Deitel Harvey Deitel. Tive um grande conhecimento com esse livro mas no capitulo que aborda a manipulação de Exceptions eu fiquei com a seguinte dúvida no tratamento das Exception no blocos try catch.

Supondo que tenho 3 métodos:

O método 3 está informado que pode lançar uma Exception, porém nesse método não tem nenhum bloco try catch para tratar a exception.

O método 2 tem somente um bloco try catch e tem uma chamada ao método 3.

O método 1 tem uma chamada ao método 2 e não tem bloco try catch e pode lança uma Exception como lança o método 3.

Minha dúvida é ? Suponhamos que o método 1 tem um fluxo de processamento que não pode ser interrompido se ocorrer algum erro nas chamadas dos métodos 2 e 3, como eu faço a tratativa para que o método 1 termine seu fluxo de processamento sem a interferência de um erro na chamada dos métodos 2 e 3.


public void metodo1(Tipo parametro) throws Exception {
    //algoritimo...
    //algoritimo...

    //metodo2(dados)

    //algoritimo...
    //algoritimo...
}

public void metodo2(Tipo parametro){
    try{
        //metodo3(dados)
    } catch (Exception e) {
          LOGGER.log(Level.ERROR, "Método - metodo2 ERRO: " + e.getMessage(), e);
    }
}

public List metodo3(Tipo parametro) throws Exception {
    // consulta no banco
}

Exemplo 2 para a resposta ao comentário do amigo Ryuuji Sensei

public void processamento(Tipo parametro) throws Exception {

    try{
        //metodo1(dados)
    } catch (Exception e) {
        LOGGER.log(Level.ERROR, "Método - processamento ERRO: " + e.getMessage(), e);
    }    
}


public void metodo1(Tipo parametro) throws Exception {
    //metodo2(dados)    
}

public void metodo2(Tipo parametro) throws ArithmeticException{
    try{
        //metodo3(dados)
    } catch (ArithmeticException e) {
        LOGGER.log(Level.ERROR, "Método - metodo2 ERRO: " + e.getMessage(), e);
    }
}

public List metodo3(Tipo parametro) throws PersistenceException {
    // consulta no banco
}

Obrigado!

  • A questão toda vai ficar em torno de como o Método 1 é chamado. O Método 1 vai repassar a quem chamar ele qualquer Exception que vier das outras chamadas. O Método 2 vai ignorar quaisquer Exceptions lançadas pelo Método 3 (visto que o catch nele está vazio) e não vai repassá-las para o Método 1.

    Ryuuji Sensei   27 de nov de 2015
  • Obrigado pela resposta Ryuuji Sensei. Eu não informei mas os catch tem somente logger, também não ocorreria nada suponho eu. Editei meu exemplo. No caso da sua resposta, então em um método eu tiver uma chamada para um outro método que lança uma exception diferente da que estou capturando no meu bloco catch, eu devo ter um outro try catch para que o erro não interfira no método que irá chama-lo ? ou seja, no exemplo 2 o metodo2 teria que ter outro try catch para capturar a exception lançada pelo método 3 ?

    EdeGerSilv   27 de nov de 2015
  • No caso em questão, a sua IDE (ou o compilador, caso esteja fazendo sem ferramentas) vai reclamar dizendo que a PersistenceException não está sendo tratada ou lançada no M2 (Método 2) e creio que o mesmo vale para a exceção que você tratou, mas que (aparentemente) não é lançada em lugar algum (ArithmeticException). Esse catch removeria a necessidade de você dar um throws na ArithmeticException, já que ela está sendo tratada dentro do próprio método. Você deve estar ciente de que as exceptions tem uma hierarquia e que, sendo seguida, você precisa tratar as de menor nível primeiro.

    Ryuuji Sensei   27 de nov de 2015
  • Obrigado Ryuuji Sensei tirei minha dúvida, então na verdade eu devo tratar o tipo de exception lançada por um método que eu estou chamando para não interferir no método chamador. No caso eu teria que ter outro bloco catch para capturar a exception lançada do método 3.

    EdeGerSilv   27 de nov de 2015
  • Correto. Observe a minha resposta para mais exemplos.

    Ryuuji Sensei   27 de nov de 2015
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

2 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags java java-ee ou faça a sua própria pergunta.