如何接收 2 个或更多不同的异常?

Posted

技术标签:

【中文标题】如何接收 2 个或更多不同的异常?【英文标题】:How to receive 2 or more different Exceptions? 【发布时间】:2011-03-29 15:54:46 【问题描述】:

我已经编写了一个代码来将用户添加到数据库中。当我们收到重复条目时,我需要重定向到 EmpInfo.jsp。我需要为此使用更多例外,而且我想知道如何重定向。

    response.setContentType("text/html");
    PrintWriter out = response.getWriter();
    Connection conn = null;
    String url = "jdbc:mysql://localhost:3306/";
    String dbName = "cervlet";
    String driver = "com.mysql.jdbc.Driver";
    String userName = "root"; 
String password = "1234";
int Empid =Integer.parseInt(request.getParameter("Empid").toString()); 
String Name = request.getParameter("Name").toString();
int Age =Integer.parseInt(request.getParameter("Age").toString()); 
int Salary =Integer.parseInt(request.getParameter("Salary").toString());
PreparedStatement stmt;
try 
 Class.forName(driver).newInstance();
 conn = DriverManager.getConnection(url+dbName,userName,password);
 System.out.println("Connected to the database");
 //ArrayList al=null;
 //ArrayList userList =new ArrayList();
 String query = "insert into employee set Empid='"+Empid+"',name='"+Name+"',Age='"+Age+"',Salary='"+Salary+"'";
stmt = (PreparedStatement) conn.prepareStatement(query);
  int i = 0;
try 
   i = stmt.executeUpdate(query);
    
  catch (SQLException e) 
    String nextj = "/AddUser.jsp";
    RequestDispatcher rd = getServletContext().getRequestDispatcher(nextj);
   rd.forward(request, response);
    
   System.out.println("i="+i);
System.out.println("query: " + query);
//if(i==0)
 //
  //String nextj = "/EmpInfo.jsp";
    //RequestDispatcher cd = getServletContext().getRequestDispatcher(nextj);
    //cd.forward(request, response);
 //response.sendRedirect("servletRecord");
//
 response.sendRedirect("/EmpInfo.jsp");
 conn.close();
 System.out.println("Disconnected from database");

 catch (Exception e) 
e.printStackTrace();

更新

当它添加一个新条目时,我需要重定向到EmpInfo.jsp。 方法executeUpadte()执行后,我使用了它的return 值重定向到另一个名为EmpInfo.jsp 的页面。 但它没有重定向。我正在使用日食。告诉我多个重定向.jsp页面的常用方法。

【问题讨论】:

与问题无关:IllegalStateException 转发/重定向失败的可能性很大,因为您已更改响应标头并在代码开头获取响应编写器。不要那样做。在这种特定情况下,绝对没有必要这样做。删除这些行。另外,您应该避免使用PreparedStatement 进行SQL 注入并关闭finally 中的JDBC 资源。 你应该在另一个问题中询问重定向。 您是否阅读了我在问题更新前 2 小时发布的评论? :) 【参考方案1】:

已经回答了处理多个异常。

关于重定向到其他页面:您可以使用(正如您已经使用过的)转发方法(如果其他页面在同一域中)和 sendRedirect 方法(其他页面可以在其他域中)。但是您需要注意不要将任何内容写入浏览器,否则在转发/重定向时会出现异常。

在您的情况下,您已经以这些语句的形式写入浏览器:

   response.setContentType("text/html");
   PrintWriter out = response.getWriter();

查看您的代码,您似乎甚至不需要这些语句,因为无论如何您都应该转发到其他页面。

注意:您在一处使用 forward 并在一处使用 sendRedirect。希望您知道这些之间的区别。在我看来,你只需要在两个地方都使用 forward 方法。

【讨论】:

【参考方案2】:

好吧,如果你问如何捕获不同的异常,下面的代码就是你的方法:

try 
    ...
    // Code that may throw a few types of exceptions
    ...
 catch(FileNotFoundException fnfe) 
    // handle very specific exceptions
 catch (IOException ioe) 
    // handle less specific exceptions
 catch (Exception e) 
    // handle the most generic exception case
 

这将允许您在一个代码块中处理多种异常类型。

【讨论】:

以上是关于如何接收 2 个或更多不同的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一个带有动态单元格的表格切换到 3 个或更多不同的视图

如何测试不同 VM 上的 2 个或多个客户端之间的交互?

如何使用 2 个或更多自定义单元格创建自定义 UICollectionView?

C++ 同时接收 2 个或更多 UDP 消息

如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?

(Linq/Lambda) 使用 2 个 DBContext 连接 2 个或更多表