【问题标题】:Preferred way to handle Java exceptions in ServletContextListener在 ServletContextListener 中处理 Java 异常的首选方法
【发布时间】:2011-05-01 04:25:10
【问题描述】:

对于 servlet 生命周期的东西,你们建议如何应对异常...

例如,

public class Foo implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        try {
           // something nasty
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        try {
           // something nasty
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

我不完全确定什么会处理上面的运行时异常。我的想法是,如果在此处抛出异常,它们会严重到足以完全破坏系统,因此(未处理的)运行时异常可能没问题。

我想我问的是什么处理来自 servlet 上下文侦听器的未经检查的异常?

【问题讨论】:

    标签: java servlets jakarta-ee


    【解决方案1】:

    当您捕获异常时,您可能需要考虑设置ServletContext 属性以指示遇到了错误。这样,如果容器没有禁用应用程序,您可以让Filters 和/或Servlets 检查ServletContext 属性并采取适当的措施,例如显示错误页面。

    【讨论】:

    • Glassfish 3.0.1 拒绝部署 Web 应用程序,如果 ServletContextListener.contextInitialized 引发 RuntimeException。但是,如果应用程序已经部署,并且在服务器重新启动时抛出 RuntimeException,则 GF 3.0.1 将完全拒绝启动(这使得使用提供的工具无法取消部署)。在这种情况下,我们选择在侦听器中设置 ServletContext 属性,并在过滤器中输出错误消息。
    【解决方案2】:

    似乎 ServletContentListener 的设计目的不是能够控制生命周期(否则它会被允许抛出 ServletException)。

    因此,我不会依赖 RuntimeException 来做任何有用的事情。查看some other threads here,它似乎在某些应用程序服务器上被记录并忽略了。

    如果在代码失败时应用程序无法启动至关重要,则应将该代码移至 Servlet 的初始化部分。

    【讨论】:

    【解决方案3】:

    最好显示一些像“技术错误,抱歉”这样的页面,而不是显示带有错误消息的堆栈跟踪。只需记录它并将用户转发到错误页面。

    【讨论】:

    • servlet 上下文监听器中的方法不会在 HTTP 请求上执行,而是在上下文启动时执行,因此无法显示错误页面。
    【解决方案4】:

    我们可以通过object.printStackTrace(); 或者通过 out.print("Exception is"+ ex); 调用异常;

    【讨论】:

    • 这仅适用于正常的连接,在 Web 应用程序中没有标准输入或输出。
    猜你喜欢
    • 2015-05-21
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多