ServletContextListener中处理Java异常的首选方法是什么?

22

针对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上下文监听器的未经检查的异常?

4个回答

11

当您捕获异常时,您可能希望考虑设置ServletContext属性,以指示发生了错误。这样,如果容器未禁用应用程序,则可以让Filter和/或Servlet检查ServletContext属性并采取适当的操作,例如显示错误页面。


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

7
似乎ServletContentListener并没有被设计为能够控制生命周期(否则它将允许抛出ServletException)。
因此,我不会依赖RuntimeException来做任何有用的事情。查看这里的一些其他线程, 在某些应用服务器上似乎被记录并忽略。
如果应用程序在您的代码失败时不能启动,则应将该代码移动到Servlet的初始化部分。

1
Servlet规范指出应用服务器“可能”中止启动应用程序:https://dev59.com/9UXRa4cB1Zd3GeqPt7fG#272747 - Thilo

0

显示类似“技术错误,抱歉”这样的页面,而不是显示带有错误消息的堆栈跟踪,这是一个良好的行为规范。只需记录它并将用户转发到错误页面。


3
Servlet上下文监听器中的方法不会在HTTP请求上执行,而是在上下文启动时执行,因此无法显示错误页面。 - Philipp Jardas

-2
我们可以通过object.printStackTrace()打印异常,或者通过out.print("Exception is"+ ex)调用异常。

2
这仅适用于普通应用程序,在Web应用程序中没有标准的输入或输出。 - Coyote21

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接