我有一个名为 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
并且也无法授予访问权限。
如何抛出异常并处理这些问题?
最佳答案
这很简单,您可以在完成回滚后重新抛出异常,或者使用 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(...);
}
关于java - 向 Servlet 中抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28209950/