如何为servlet抛出init()方法的异常

时间:2013-04-30 01:02:52

标签: java servlets exception-handling init factories

我将首先展示我的代码:

@Override
public void init() throws ServletException {
    super.init();

    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (Exception e) {
        System.err.println("Error creating security controller; " + e.getMessage());
    }

    // max allowed uploaded uploadedFile size is 10 MB
    maxFileSize = getBytes(10);
    maxMemSize = getBytes(2);
}

正如您所看到的,编译器迫使我使用try / catch来实例化SecurityController。但就我而言,我认为如果无法实例化安全控制器,它应该停止实例化Servlet并抛出异常。对此有何建议/解释?

3 个答案:

答案 0 :(得分:8)

仔细阅读the javadoc of init() method

  

初始化

     

public void init() throws ServletException

     

...

     

抛出:

     

ServletException - 如果发生中断servlet正常操作的异常

看那里,你应该把它改成ServletException。符合Servlet API specification的第2.3.2.1章,servlet将不会投入使用:

  

2.3.2.1初始化时的错误条件

     

在初始化期间,servlet实例可以抛出UnavailableException或a   ServletException。在这种情况下,不得将servlet置于活动服务中   并且必须由servlet容器释放。 destroy方法不会被调用   被认为是不成功的初始化。

     

...

因此,只需执行文档所声明的内容(这是正常的过程,顺便说一句,你应该像Java初学者一样理解/意识到非常好):

@Override
public void init() throws ServletException {
    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (Exception e) {
        throw new ServletException("Error creating security controller", e);
    }

    maxFileSize = getBytes(10);
    maxMemSize = getBytes(2);
}

请注意,我删除了不必要的super.init()电话。 javadoc并没有告诉您init()只要init(ServletConfig)需要这样做。


对具体问题

无关catch上过于通用的Exception被视为不良做法。您当然不希望在RuntimeException上使用过于通用的catch覆盖Exception,因为这可能会无意中隐藏程序员的错误/错误。

您应该尝试在catch中尽可能具体,尽可能详细地捕捉这些方法的throws中声明的异常。例如:

    try {
        securityController = SecurityControllerFactory.getInstance().create();
    } catch (SecurityControllerCreationException e) {
        throw new ServletException("Error creating security controller", e);
    }

另一个原因也可能是所讨论的方法设计得非常糟糕,以至于它们自称为throws Exception。你应该反过来修复那个部分。

答案 1 :(得分:3)

或者你可以将它们包装在ServletException中:

try {
    securityController = SecurityControllerFactory.getInstance().create();
} catch (Exception e) {
    throw new ServletException ("Failed to create controller.", e);
}

然而,仅仅捕获Exception并不是一个好的形式,你应该只捕获create方法抛出的特定的一个。

答案 2 :(得分:-1)

如果你真的想抛弃它们,你可以抛出一个运行时异常:

try {
   //do stuff
} catch (Exception e) {
   throw new RuntimeException("There was an exception initializing the servlet:  ", e);
}