我有一个名为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无法访问ps
或con
且访问权限无法访问也给予了。
如何抛出异常,同时处理这些问题?
答案 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)
我能想到的一些方法:
关闭连接或回滚..和语句,然后重新抛出异常,如:
catch(SQLException ...) {
//close statement
//rollback changes
throw ....
}