抛出java.lang.Error是否可行?

我有一个进入Web应用程序的插件模块。 如果模块加载不正确,Web应用程序无法继续,Web应用程序可能根本无法加载,我们希望此模块始终正确初始化。 如果我要抛出一个运行时异常,它会进入日志,只是被忽略,因为应用程序仍然会继续,并且最终用户永远不会知道......我知道错误只能在特殊情况下抛出,他们通常必须处理系统无法恢复的情况,但在这种情况下你会做什么?


我经常在业务代码中使用的唯一ErrorExceptionInInitializerError 。 您在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

上一篇: Is it ever OK to throw a java.lang.Error?

下一篇: Resource Availability and Utilization Tracking