Usando Try-catch

3 respostas
M

Pessoal, sempre usei Try-catch mas nunca dei importância se estou usando de maneira correta !!!

Seguindo um dos meus métodos… por favor, me indiquem onde posso melhorar e corrigir:

public List<Menu> listaMenuJDBC(Menu menu) throws SQLException, Exception{
	ArrayList<Menu>	 array 	= new ArrayList<Menu>();
	PreparedStatement sql 	= null;
	ResultSet   	 rs	= null;
	Conexao 		 cnct 	= new Conexao();;
		
		try{
			cnct.conecta();	
			sql		= cnct.conn.prepareStatement
				("SELECT pai, " +
				 "       codigo, " +
				 "       tipo, " +
				 "       rpad(' ',(level*5))||descricao Descricao " +
				 "  FROM ps_menu m " + 
				 "CONNECT BY PRIOR CODIGO = PAI START WITH PAI = 0");
			rs = sql.executeQuery();
			while (rs.next()){
				menu = new Menu();
				menu.setPai			(rs.getInt(1));
				menu.setCodigo		(rs.getLong(2));
				menu.setTipo		(rs.getInt(3));
				menu.setDescricao	(rs.getString(4));
				
				array.add(menu);
			}
			sql.close();
			rs.close();
		}
		catch(SQLException sqle){
			System.out.println(sqle.getMessage());
			throw new SQLException (sqle.getMessage());
		}
		catch(Exception e){
			System.out.println(e.getMessage());
			throw new Exception (e.getMessage());
		}
		finally{
			try{
				 if ((cnct.conn!=null) && (!cnct.conn.isClosed())) {
					 cnct.conn.close();
				 }
		     }
		     catch(Exception e){e.printStackTrace();}
		}
		
		return array;
	}

Valew.

3 Respostas

vanzella

Só um conselho feche o ResultSet e o PreparedStatement no metodo finally.
No mais não vi problema nenhum.

marcelo_mococa

porque pegar a exceção somente para lança-la novamente? e ainda com a mesma mensagem de erro?

eu faria da seguinte forma:
teria uma exceção minha, por exemplo BDAccessException (nome feio, rs) e no tratamento da exceção eu faria assim:

catch(SQLException sqle){
 			throw new BDAccessException ("Erro ao fazer tal coisa", sqle);
 		}

assim a classe que usa este DAO não precisa conhecer SQLException e sim CDAccessExceptione e você estará retornando uma exceção com uma mensagem de melhor entendimento.

llslucas

Recriando a exception com a mesma mensagem, você perde toda a referência de Stack Trace.
Se você deseja relançar a exeption após escrever sua mensagem no Log, deve fazer o seguinte:

catch(SQLException sqle){
			System.out.println(sqle.getMessage());
			throw sqle;
		}
		catch(Exception e){
			System.out.println(e.getMessage());
			throw e;
		}

De qualquer modo, muitos desenvolvedores (muitos mesmo!) tem mania de fazer um try-catch para cada trecho de código que lança alguma Exception, fazendo Log em cada um deles. Por algum motivo, muitos pregam isso como boa prática.
Agora imagine que sua Exception passe por 10 métodos diferentes e em cada um deles você faça Log. Resultado? Seu arquivo de Log terá 10 mensagens do mesmo erro!

Por isso, deixe sempre a responsabilidade de fazer Log dos erros para o método que estiver mais distante de onde o erro foi lançado. :wink:

Criado 7 de agosto de 2007
Ultima resposta 20 de fev. de 2009
Respostas 3
Participantes 4