我将首先展示我的代码:
@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并抛出异常。对此有何建议/解释?
答案 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
或aServletException
。在这种情况下,不得将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);
}