向Servlet抛出异常

时间:2015-01-29 08:19:56

标签: java exception servlets jdbc

我有一个名为ProblemServlet的Servlet。我有一个名为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,因为servlet无法访问pscon且访问权限无法访问也给予了。

如何抛出异常,同时处理这些问题?

2 个答案:

答案 0 :(得分:3)

这很简单,您可以在完成回滚后重新抛出异常,或者使用new抛出另一个异常:

// 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(...);
    }

答案 1 :(得分:2)

我能想到的一些方法:

  • 在您的类中注入父级并公开setter,以便您可以访问连接和预准备语句。我不推荐这种最糟糕的方式!
  • 关闭连接或回滚..和语句,然后重新抛出异常,如:

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