Como colocar mais de uma exceção no método?

8 respostas
java
Dayson_Rodrigues

Tenho uma classe service e quero atribuir mais de uma exceção, estou fazendo assim, mais não está dando certo.

public void excluir(Cliente cliente) throws NegocioException {
		try{
			clienteDAO.excluir(cliente);
		}catch(SqlExceptionHelper e){
			throw new NegocioException("Cliente já possui cadastro!");
		}
		catch (Exception e) {
			throw new NegocioException("Não foi possível excluir o carro!");
		}
	}

8 Respostas

L

Sempre que você quiser ou precisar capturar mais de um tipo de exceção, certifique-se de que não está colocando uma super classe antes de uma sub classe:
Isto funciona:
try {

} catch(IOException ex){
//IOException é uma sublcasse de Exception
} catch (Exception ex){

}

Isso não funciona
try {

} catch (Exception ex){
//Exception é super classe de SQLException
} catch (SQLException ex1){
//SQLException nunca será atingida, pois o catch(Exception ex) irá capturar todas as exceções, sejam elas SQLException ou não.
}
Jonathan_Medeiros

Desta maneira abaixo você consegue fazer um catch multiplo:

public void excluir(Cliente cliente) throws NegocioException {
  try{
     clienteDAO.excluir(cliente);
  }catch(Exception | SqlExceptionHelper e){
     throw e;
  }
}
staroski

O que você quer fazer exatamente, lançar mais de uma exceção ou tratar mais de uma exceção?

Para lançar mais de uma:

public void meuMetodo() throws Excecao1, Excecao2, ExcecaoN {
    // implementação
}

Para tratar mais de uma:

public void meuMetodo() {
    try {
        // implementação
    } catch (Excecao1 e1) {
          // tratamento
    } catch (Excecao2 e2) {
          // tratamento
    } catch (ExcecaoN eN) {
          // tratamento
    }
}

Se o tratamento para todas elas for igual:

public void meuMetodo() {
    try {
        // implementação
    } catch (Excecao1 | Excecao2 | ExcecaoN e) {
          // tratamento
    }
}
Dayson_Rodrigues

Opa Vamos lá, na realidade eu quero tratar a Exceção da Entidade Cliente que está no meu Service, o Meu DAO tinha uma exceção, acabei tirando. Só que ainda não consigo.

OBS: Ao passar o mouse em cima d SqlExceptionHelper aprendenta esse erro: No exception of type SqlExceptionHelper can be thrown; an exception type must be a subclass of Throwable

public void salvar(Cliente cliente) throws NegocioException{
		try{
		    clienteDAO.salvar(cliente);
		}catch (SqlExceptionHelper e) {
	         	throw new NegocioException("Já possui um cliente cadastro neste CPF.");
		}catch(Exception e){
			throw new NegocioException("Não foi possível salvar o cliente.");
		}
	}
staroski

A mensagem é bastante clara:
Nenhuma exceção do tipo SqlExceptionHelper pode ser lançada; uma exceção precisa ser uma subclasse de Throwable.

Você está fazendo um catch de SqlExceptionHelper, mas não é possível fazer um throw de objetos desta classe, logo, não é possível fazer catch da mesma.

Dayson_Rodrigues

hum… então no caso como faria para informar ao usuário que já existe um cadastro? já que não pode tratar esse exceção? ou deixaria somente uma Exception para tudo?

shodaime

olá para informar que existe um cliente cadastrado, você poderia fazer uma verificação antes de acionar o seu DAO e passar uma mensagem avisando.
para as exceções eu faço da seguinte forma

// metodo no DAO

public void meuMetodoDAO() throws SQLException, Exception {
// implementação do método
} 

// classe Service

public static void meuMetodoService()throws Exception {

// validações
try{

}catch(Exception ex) {
throw new Exception (ex.getMessage());
}

Nunca tive problemas em relação a isso usando desta forma, caso alguem do forum saiba alguma forma para q eu possa melhorar fiquem a vontade para ajudar tbm

staroski

Acho que você não entendeu, SqlExceptionHelper não é uma classe de exceção, aliás, o nome dela, com sufixo Helper, sugere que seja uma classe utilitária.

Você pode criar suas classes de exceção, por exemplo uma classe UsuarioExistenteException, você só precisa estender Throwable, ou uma subclasse de Throwable, como por exemplo Exception, caso seja uma exceção checada em tempo de compilação ou RuntimeException caso seja uma exceção não checada.

Criado 20 de março de 2017
Ultima resposta 21 de mar. de 2017
Respostas 8
Participantes 5