Это когда-нибудь нормально, чтобы бросить java.lang.Error? - PullRequest
7 голосов
/ 22 апреля 2010

У меня есть модуль плагина, который входит в веб-приложение.Если модуль загружается неправильно, веб-приложение не имеет смысла продолжать работу, и веб-приложение, вероятно, вообще не должно загружаться, мы бы предпочли, чтобы этот модуль всегда корректно инициализировался.Если бы я выбрасывал исключение времени выполнения, оно попадало бы в журналы и просто игнорировалось, поскольку приложение все равно продолжало бы работать, и конечные пользователи никогда бы не узнали ... Я знаю, что ошибки должны создаваться только при исключительных условияхи они обычно имеют отношение к ситуациям, из которых система не может восстановиться, но что бы вы сделали в такой ситуации?

Ответы [ 3 ]

4 голосов
/ 22 апреля 2010

only Error, который я регулярно использовал в бизнес-коде: ExceptionInInitializerError. У вас нет другого выбора в static блоках инициализатора.

Но даже если вы выбросите это в веб-приложение, веб-приложение все равно будет прослушивать 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 с данным сообщением.

1 голос
/ 22 апреля 2010

Не уверен, как именно, но OSGi получила управление зависимостями пакетов (= похоже на плагины). Один пакет не загружается, пока другой пакет не будет готов. Возможно, вы можете использовать этот же механизм (или просто использовать сам OSGi;)) для ожидания одного плагина / приложения, пока другой плагин не будет готов. Или вы закрываете приложение во время запуска, если оно не может правильно найти / загрузить плагин.

0 голосов
/ 16 апреля 2014

Зарегистрируйте ошибку, а затем используйте System.Exit для выхода из приложения.

...