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

时间:2016-06-02 19:04:23

标签: java mysql jsp servlets

我有基于JSP / Servlet的Web应用程序。数据库是MySQL。在Web应用程序中,insertForm.jsp调用Servlet,它在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:复制条目''for ...

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

  

java.lang.NumberFormatException:null

这也没关系。但现在我也有Throwable例外或error-code 500因此,快乐的用户会看到errorPage.jsp对应的文字。 问题:

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

1 个答案:

答案 0 :(得分:0)

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

 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和{{1 }} <exception-type>java.lang.Throwable</exception-type>

中的结果
  

导致java.lang.IllegalArgumentException:类DBInsertRows捕获了SQLException - &gt; com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:服务器上的密钥'TankName_UNIQUE'的重复条目''。