不同的行为取决于数据库中的异常



我有一个基于JSP/Servlet的web应用程序。数据库是MySQL。在web应用程序中,有一个调用Servlet的insertForm.jsp,它调用java类中的ins方法。

imports ...
public class DBaddData extends HttpServlet {        
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
...
some code
...
//create an instanse of a class responsible for insert
DBInsertRows dbir = new DBInsertRows();
try {
//call the inssert method
dbir.ins(dbObj);
} catch (ClassNotFoundException ex) {
Logger.getLogger(DBaddData.class.getName()).log(Level.SEVERE, null, ex);
} 
...
RequestDispatcher ...
}
}

使用ins方法的类:

public class DBInsertRows {  
public void ins(DBObjBaseStd dbObject) throws ClassNotFoundException
{
Connection con = null;
Statement stmt = null;    
String query = "INSERT INTO bla-bla-bla ...";    
try {
...
create con object
...    
stmt = con.createStatement();    
stmt.executeUpdate(query);
} catch (SQLException sqlEx) {    
sqlEx.printStackTrace();
} 
}
}

插入过程运行良好,但是!当我试图插入相同的对象(行),使ID已经存在于表中时,我得到了一个异常:
MySQL文本

。。。错误代码:1062。重复条目。。。

Apache Tomcat8文本

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:的条目"重复。。。

这完全没问题。不好的是,我没有HTTP状态500,因此我不知道如何获得此异常并在我的errorPage.jsp上显示DeleteIdea的另一种情况完全相同:用户点击删除按钮,jsp调用负责删除的servlet,用delete方法调用类。但如果用户在没有选择对象的情况下点击删除,我会得到异常:

java.lang.NumberFormatException:空

这也很好。但现在我也有Throwable异常或error-code 500,因此快乐的用户看到errorPage.jsp和相应的文本。问题:

  1. 为什么会有不同类型的错误
  2. 如何将错误文本从ins方法传递到我的errorPage.jsp

我仍然不确定这是否是一个好方法,但我在catch块中添加了throw。现在的代码是:

try {
Class.forName(...driver...);
con = DriverManager.getConnection(... connection info...);
stmt = con.createStatement();
stmt.executeUpdate(query);
} catch (SQLException sqlEx) {
throw new IllegalArgumentException("class DBInsertRows caught SQLException -> "+sqlEx);      
} 

现在,如果用户试图复制信息,或者,例如,变量比表中的字段长,他将得到errorPage.jsp,因为sqlEx现在是Throwable<exception-type>java.lang.Throwable</exception-type>errorPage.jsp中的结果

您导致java.lang.IollegalArgumentException:类DBInsertRows捕获SQLException->com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:服务器上键"TankName_UNIQUE"的条目"重复。

最新更新