【问题标题】:How to handle exception in my servlet correct如何正确处理我的 servlet 中的异常
【发布时间】:2014-06-14 13:01:41
【问题描述】:

我有一些问题让异常做我想要的!。我创建了一个 servlet,我想处理所有异常。我在这个场景下的课程建设,我也需要帮助,你在下面看到:

Servlet: 此异常处理仅针对 1 种方法,

try {
completed = func.addNewOperator(userId, name, ini, cpr, password, role);
}catch (Exception e) {
    Error = "There was a problem with database access";
    response.sendRedirect("SystemError.jsp?Error_resultat=" + Error);
} catch (IOException e) {
    Error = "Error found with connection";
    response.sendRedirect("SystemError.jsp?Error_resultat=" + Error);
} catch (RuntimeException e) {
    Error = "Error found with entered values";
    response.sendRedirect("SystemError.jsp?Error_resultat=" + Error);
} catch (Exception e) {
    Error = "Serious error found!";
    response.sendRedirect("SystemError.jsp?Error_resultat=" + Error);

func.addNewOperator 在我的函数类中被调用:

功能:

你在下面看到的我的函数方法的一个小例子:

public boolean addNewOperator(String userId, String name, String ini, String cpr, String password, String role ) throws Exception { 

int id = Integer.parseInt(userId);

}

所以假设它不能将它解析为整数,它应该向我的 servlet 抛出异常,但这不起作用。我想向 servlet 抛出异常,然后 servlet 应该向 open SystemError.jsp 发送响应,并带有错误消息作为参数。

谁能看看我是不是忘记了什么??

【问题讨论】:

    标签: java exception servlets


    【解决方案1】:

    顺序是先匹配,先执行 (as the JLS clearly explains)。

    如果第一个 catch 与异常匹配,则执行,如果不匹配,则尝试下一个并不断尝试,直到有一个匹配或没有匹配。

    因此,在捕获异常时,您希望始终先捕获最具体的,然后再捕获最通用的(如 RuntimeException 或 Exception)。

    阅读更多Order of catching exceptions in Java

    catch (Exception e) 应该是链中的最后一个 catch 块。

    值得一读Oracle Java Tutorial - Exceptions

    这样试试,别忘了把异常记录到日志文件中。

    try {
        completed = func.addNewOperator(userId, name, ini, cpr, password, role);
    }catch (SQLException e) {
        Error = "There was a problem with database access";     
    } catch (IOException e) {
        Error = "Error found with connection";
    } catch (RuntimeException e) {
        Error = "Error found with entered values";
    } catch (Exception e) {
        Error = "Serious error found!";
    }
    
    if(Error != null){
        response.sendRedirect("SystemError.jsp?Error_resultat=" + Error);
    }
    

    NumberFormatExceptionRuntimeException

    【讨论】:

    • Oki,很高兴看到这么快的答案,我马上试试。
    • 它的工作.. thx man,现在我可以用这种方式控制我的整个程序了。
    • 由于主键,它并不总是捕获 SQL 异常,不断获得重复条目。
    【解决方案2】:

    首先,你不应该重定向到一个jsp页面,而是转发到它。通常,jsp 文件放在WEB-INF 下,从不直接调用,而是始终通过服务器调用。下面是一个转发示例(来自Java Tips - How to forward requests from Servlet to JSP :):

    request.setAttribute("error", error);
    getServletConfig().getServletContext().getRequestDispatcher("/WEB-INF/SystemError.jsp")
        .forward(request,response);
    

    然后你通过${error}在你的jsp中得到error(第一个字母小写,因为它是一个变量)

    无论如何,你不应该在你的 servlet 级别处理这个问题,而是将这个低级别的工作委托给容器,正如 SO 的另一篇帖子中所解释的那样:How to Properly Handle Exceptions in a JSP/Servlet App?

    【讨论】:

    • html文件呢,是不是也要放到WEB-INF下?
    • 当然不是,因为它们会直接从客户端浏览器询问。 HTML、CSS 或图像必须在 WEB-INF 之外,控制器才能直接为它们提供服务。但是 jsp 是源元素(它们将被转换为 HTML),应该隐藏并只能通过 servlet 的转发访问。
    • 很好地使用了重定向,但现在我得到了这个错误:java.lang.IllegalStateException: getOutputStream()
    猜你喜欢
    • 2011-09-05
    • 2021-05-22
    • 2011-02-24
    • 2016-12-30
    • 2014-05-23
    • 1970-01-01
    • 2013-07-24
    • 2015-08-13
    相关资源
    最近更新 更多