在ServletContextListener中处理Java异常的首选方法

Tob*_*oby 19 java servlets java-ee

对于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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

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

ksc*_*eid 10

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

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

Thi*_*ilo 6

似乎ServletContentListener的设计不能控制生命周期(否则会抛出ServletException).

因此,我不会依赖RuntimeException来做任何有用的事情.在这里查看其他一些线程,它似乎在某些应用程序服务器上被记录并被忽略.

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