2015-01-29 10 views
0

У меня есть сервлет под названием ProblemServlet. У меня есть класс базы данных ProblemTable. Теперь ниже приведен единственный метод из этого класса ProblemTable.Выбрасывание исключения в сервлет

package DB; 

import Controller.Common; 
import java.sql.Date; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class ProblemsTable extends DBMaster 
{ 
    public void deleteProblem(int idProblem) 
    { 
     checkConnection(); 
     PreparedStatement ps = null; 
     String result=""; 

     try 
     { 
      con.setAutoCommit(false); 
      String sql = "DELETE FROM Problem WHERE idProblem=?"; 
      ps = con.prepareStatement(sql); 

      ps.setInt(1,idProblem); 

      int i = ps.executeUpdate(); 
      con.commit(); 

      if(i>0) 
      { 
       result="Deleted Succesfully"; 
      } 
      else 
      { 
       result="Delete Failed"; 
      } 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
      result = "Delete Failed. Rolled back"; 

      try { 
       con.rollback(); 
      } catch (SQLException ex) { 
       ex.printStackTrace(); 
       result = "Delete failed. Rollback failed"; 
      } 
     } 
    } 
} 

Как вы можете видеть, я исключаю исключение из этого класса. Однако я хотел бы поймать эти исключения внутри ProblemServlet, потому что тогда я могу отобразить ошибку как alert()

Теперь моя проблема в этом.

Если я бросаю исключение, то я не буду в состоянии назвать con.rollback() или ps.close, потому что сервлет не имеет доступа к ps или con и доступ не может быть дано слишком.

Как я могу исключить исключение, рассматривая эти проблемы?

+0

Да, вы можете бросить обычное исключение отсюда и обработать сервлет. –

ответ

2

Некоторые способы я могу думать:

  • впрыскивать родителя в классе и разоблачить сеттер, чтобы вы могли иметь доступ к связи и подготовленное заявление. Я бы не рекомендовал этот худший путь!
  • Вы закрыть соединение или откат .. и утверждение, а затем Rethrow исключение, как:

    catch(SQLException ...) { 
        //close statement 
        //rollback changes 
        throw .... 
    } 
    
3

Это довольно просто, вы можете повторно выдать исключение после you'v сделаны с откатом, или бросить еще одно исключение с новым:

// 1

catch(SQLException e) 
    { 
     e.printStackTrace(); 
     result = "Delete Failed. Rolled back"; 

     try { 
      con.rollback(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
      result = "Delete failed. Rollback failed"; 
     } 
     throw e; 
    } 

// 2

catch(SQLException e) 
    { 
     e.printStackTrace(); 
     result = "Delete Failed. Rolled back"; 

     try { 
      con.rollback(); 
     } catch (SQLException ex) { 
      ex.printStackTrace(); 
      result = "Delete failed. Rollback failed"; 
     } 
     throw new Exception(...); 
    } 
Смежные вопросы