向 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 无法访问 ps
或 con
并且也不能给权限。
如何抛出异常,同时处理这些问题?
我能想到的一些方法:
- 在您的 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(...);
}
我有一个名为 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 无法访问 ps
或 con
并且也不能给权限。
如何抛出异常,同时处理这些问题?
我能想到的一些方法:
- 在您的 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(...);
}