Is it ever OK to throw a java.lang.Error?
I have a plugin module that goes into a web application. If the module does not load correctly, it does not make sense for the web application to go on, and the web application should probably not load at all, we would prefer this module to initialize correctly always. If I were to throw a runtime exception, it would get into the logs, and just get ignored since the application will continue anyway, and the end users would never know... I know that errors are meant to be thrown only under exceptional conditions, and they generally have to do with situations that the system cannot recover from, but what would you do in such a situation?
The only Error
which I've regularly used in business code is ExceptionInInitializerError
. You have no other choice in static
initializer blocks.
But even if you throw that inside a webapplication, the webapplication would still continue listening on HTTP requests. Your best bet is to do the module loading or initialization inside a Filter
listening on an url-pattern
of /*
and let the Filter
block the HTTP requests accordingly. Eg
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.");
}
}
This would yield a HTTP 500 error with the given message.
Not sure how exactly but OSGi got a dependency management of bundles (=similar to plugins). One bundle don't load until another bundle is ready. Maybe you can use this same mechanism (or simply use OSGi itself ;)) to wait for one plugin/application until another plugin is ready. Or you shutdown the application during startup if it cannot find/load your plugin correctly.
记录错误,然后使用System.Exit来退出应用程序
链接地址: http://www.djcxy.com/p/45566.html上一篇: 设置粘液