2010-04-22 9 views
7

Mam moduł wtyczki, który trafia do aplikacji internetowej. Jeśli moduł nie ładuje się poprawnie, aplikacja internetowa nie ma sensu, a aplikacja internetowa prawdopodobnie nie ładuje się wcale, wolelibyśmy, aby ten moduł zawsze był poprawnie inicjowany. Gdybym rzucił wyjątek środowiska wykonawczego, dostałby się do logów i po prostu zostałby zignorowany, ponieważ aplikacja i tak będzie kontynuowana, a użytkownicy końcowi nigdy by się nie dowiedzieli ... Wiem, że błędy mają być zgłaszane tylko pod wyjątkowe warunki i zazwyczaj dotyczą sytuacji, z których system nie może się wyleczyć, ale co byś zrobił w takiej sytuacji?Czy można rzucić java.lang.Error?

+0

nie powinien być błąd, ale niektóre odpowiednie podklasy, albo istniejące lub jeden zdefiniować. Ale wyrzucenie podklasy błędu jest odpowiednie w twojej sytuacji. –

Odpowiedz

4

tylkoError który ja regularnie wykorzystywane w kodzie biznesowym jest ExceptionInInitializerError. Nie masz innego wyboru w blokach inicjalizatora static.

Ale nawet jeśli wrzucisz to do aplikacji internetowej, webaplikacja nadal będzie nasłuchiwała na żądaniach HTTP. Najlepiej jest załadować moduł lub zainicjować go wewnątrz urządzenia Filter, słuchając na url-pattern z /* i pozwól, aby Filter zablokował odpowiednio żądania HTTP. Na przykład.

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."); 
    } 
} 

Da to błąd HTTP 500 z podaną wiadomością.

1

Nie jestem pewien jak dokładnie, ale OSGi ma zarządzanie zależnościami pakietów (= podobne do wtyczek). Jeden pakiet nie ładuje się, dopóki inny pakiet nie będzie gotowy. Być może możesz użyć tego samego mechanizmu (lub po prostu użyć samego OSGi;)), aby poczekać na jedną wtyczkę/aplikację, dopóki kolejna wtyczka nie będzie gotowa. Lub zamkniesz aplikację podczas uruchamiania, jeśli nie możesz znaleźć/załadować poprawnie wtyczki.

+0

Wygląda jak młotek wszystkich gwoździ, jednak lubię OSGi, mam tendencję do pochwały. Poza tym powinien działać każdy rodzaj mechanizmu zarządzania zależnościami (IoC, ty to nazwij). – Riduidel

-1

Zaloguj się błąd, a następnie użyj System.exit po prostu zamknąć aplikację

+0

Nie zapewnia to żadnego wskazania (poza kodem powrotu), dlaczego aplikacja nie działa. –

+0

@HotLicks Dodałem propozycję, aby najpierw zarejestrować błąd, a następnie zakończyć. – Demi