5

好吧,我将首先显示我的代码:

@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 并通常抛出异常。对此有何建议/解释?

4

3 回答 3

8

仔细阅读方法的javadocinit()

在里面

public void init() throws ServletException

...

抛出:

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

看那里,你应该把它重新扔为ServletException. 符合Servlet API 规范第 2.3.2.1 章,该 servlet 不会投入服务:

2.3.2.1 初始化错误条件

在初始化期间,servlet 实例可以抛出一个UnavailableException或一个 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的 onException被认为是不好的做法。您当然不想RuntimeException用过于通用的方式覆盖 s,catch因为Exception这可能会无意中隐藏程序员的错误/错误。

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

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

另一个原因也可能是所讨论的方法设计得非常糟糕,以至于它们本身被声明为throws Exception. 您也应该反过来修复该部分。

于 2013-04-30T02:43:41.483 回答
3

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

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

但是,仅捕获异常并不是一种好的形式,您应该只捕获由 create 方法抛出的特定异常。

于 2013-04-30T01:19:25.593 回答
-1

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

try {
   //do stuff
} catch (Exception e) {
   throw new RuntimeException("There was an exception initializing the servlet:  ", e);
}
于 2013-04-30T01:17:05.507 回答