【问题标题】:Throwing an exception into the Servlet向 Servlet 中抛出异常
【发布时间】:2015-03-28 09:32:33
【问题描述】:

我有一个名为 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,也无法授予访问权限。

我怎样才能抛出异常,同时处理这些问题?

【问题讨论】:

  • 是的,您可以从这里抛出自定义异常并从 servlet 处理。

标签: java exception servlets jdbc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我能想到的一些方法:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-10
      • 2012-04-23
      • 2014-12-03
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多