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

时间:2010-04-22 13:33:08

标签: java web-applications error-handling

我有一个插入Web应用程序的插件模块。 如果模块没有正确加载,Web应用程序继续运行没有意义,Web应用程序根本不应该加载,我们更喜欢这个模块始终正确初始化。 如果我要抛出一个运行时异常,它会进入日志,然后被忽略,因为应用程序无论如何都会继续,最终用户永远不会知道...... 我知道只有在特殊情况下才会抛出错误,而且它们通常与系统无法恢复的情况有关,但在这种情况下你会做什么?

3 个答案:

答案 0 :(得分:4)

我在商业代码中经常使用的 ErrorExceptionInInitializerErrorstatic初始化程序块中没有其他选择。

但即使你把它扔进web应用程序,web应用程序仍然会继续监听HTTP请求。最好的办法是在Filter url-pattern /*内进行模块加载或初始化,并让Filter相应地阻止HTTP请求。 E.g。

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错误。

答案 1 :(得分:1)

不确定OSGi究竟是如何完成捆绑包的依赖管理(=类似于插件)。在另一个捆绑准备好之前,不会加载一个捆绑包。也许你可以使用相同的机制(或简单地使用OSGi本身;))等待一个插件/应用程序,直到另一个插件准备好。或者,如果无法正确查找/加载插件,则在启动期间关闭应用程序。

答案 2 :(得分:-1)

记录错误,然后使用System.Exit退出应用程序