向 Servlet 抛出异常

Throwing an exception into the Servlet

我有一个名为 ProblemServlet 的 Servlet。我有一个名为 ProblemTable 的数据库 class。现在,下面是 ProblemTable class.

中的一个方法
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";
            }
        }
    }
}

如您所见,我正在捕获此 class 中的异常。但是我想在 ProblemServlet 中捕获这些异常,因为我可以将错误显示为 alert()

现在我的问题是这个。

如果我抛出异常,那么我将无法调用 con.rollback()ps.close,因为 servlet 无法访问 pscon 并且也不能给权限。

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

我能想到的一些方法:

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

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

这很简单,你可以在完成回滚后重新抛出异常,或者用 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(...);
    }