抛出java.lang.Error是否可行?
我有一个进入Web应用程序的插件模块。 如果模块加载不正确,Web应用程序无法继续,Web应用程序可能根本无法加载,我们希望此模块始终正确初始化。 如果我要抛出一个运行时异常,它会进入日志,只是被忽略,因为应用程序仍然会继续,并且最终用户永远不会知道......我知道错误只能在特殊情况下抛出,他们通常必须处理系统无法恢复的情况,但在这种情况下你会做什么?
我经常在业务代码中使用的唯一Error
是ExceptionInInitializerError
。 您在static
初始化块中没有其他选择。
但即使您将其放入Web应用程序中,该Web应用程序仍会继续侦听HTTP请求。 你最好的选择是在Filter
的模块加载或初始化中监听/*
的url-pattern
,并让Filter
阻止HTTP请求。 例如
private boolean allModulesAreLoaded;
@Override
public void init(FilterConfig config) {
try {
// Load modules.
allModulesAreLoaded = true;
} catch (Exception e) {
// Handle.
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (allModulesAreLoaded) {
chain.doFilter(request, response);
} else {
throw new ServletException("Not all modules are loaded.");
}
}
这将产生给定消息的HTTP 500错误。
不确定OSGi究竟是如何得到bundle的依赖管理(=类似于插件)。 一个捆绑包在另一个捆绑包准备好之前不会加载。 也许你可以使用相同的机制(或简单地使用OSGi本身;))等待一个插件/应用程序,直到另一个插件准备就绪。 或者,如果它无法正确找到/加载插件,则在启动过程中关闭该应用程序。
记录错误,然后使用System.Exit来退出应用程序
链接地址: http://www.djcxy.com/p/45565.html