Erro no tratamento de erro

2 respostas
C

Estou com dúvidas para tratar este erro, é uma boa prática colocar um try identado a outro ???

public Transact() {
  Connection conn;
		
   try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         conn = DriverManager.getConnection("jdbc:odbc:Teste","","");
         Statement stmt = conn.createStatement();
			
         conn.setAutoCommit(false);
         try {
	stmt.executeUpdate(sql1);
	stmt.executeUpdate(sql2);
	stmt.executeUpdate(sql3);
			
                conn.commit();	
				
	System.out.println("ok");
          }
          catch(SQLException e) {
                conn.rollback(); 
                System.out.println("Transação falhou"); 
          }
          conn.setAutoCommit(true);
     }
     catch(ClassNotFoundException e) {
	System.out.println(e.toString());	
     }
     catch(SQLException e) {
	System.out.println(e.toString());	
     }
}

Eu não consegui tratar o Rollback com o catch mais abaixo, pois ele não tinha certeza de que o objeto conn havia instânciado, então resolvi colocar um try dentro de outro e funcionou !!!

Estou na caminho certo ???

2 Respostas

T

eu diria q naum =]

xeu dizer como eu colocaria...
public Transact() {
  Connection conn;
   Statement stmt;
   try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         conn = DriverManager.getConnection("jdbc:odbc:Teste","","");
         stmt = conn.createStatement();
         conn.setAutoCommit(false);

         stmt.executeUpdate(sql1);
         stmt.executeUpdate(sql2);
         stmt.executeUpdate(sql3);   
         conn.commit();

         System.out.println("ok");
     }
     catch(ClassNotFoundException e) {
        System.out.println(e.toString());
     }
     catch(SQLException e) {
       if ((conn != null) && (stmt != null)) {
           try {
              conn.rollback();
           } catch(SQLException e) {}
           System.out.println("Transação falhou");
           return;
       }
       System.out.println(e.toString());   
     } finally {
           if (conn != null)
                try { conn.setAutoCommit(true);}
                catch(SQLException e) {}
     }
}
axo melhor assim
C

O Tomaz tem razão para poder usar um rollbak dentro de um catch não tem jeito tem que usar um outro try, a conexão já lança a exceção pra frente, é obrigação de quem usar capturar. O exemplo do Tomaz é mais correto do ponto de vista de boas práticas.

Criado 25 de março de 2004
Ultima resposta 25 de mar. de 2004
Respostas 2
Participantes 3