2010-04-22 12 views
7

Ich habe ein Plugin-Modul, das in eine Webanwendung geht. Wenn das Modul nicht korrekt geladen wird, ist es für die Webanwendung nicht sinnvoll, weiterzugehen, und die Webanwendung sollte wahrscheinlich überhaupt nicht geladen werden. Wir würden es vorziehen, wenn dieses Modul immer korrekt initialisiert wird. Wenn ich eine Laufzeitausnahme werfen würde, würde es in die Protokolle gelangen, und nur ignoriert werden, da die Anwendung sowieso weitergeht, und die Endbenutzer würden nie wissen ... Ich weiß, dass Fehler nur unter geworfen werden sollen außergewöhnliche Bedingungen, und sie haben in der Regel mit Situationen zu tun, aus denen das System nicht wiederherstellen kann, aber was würden Sie in einer solchen Situation tun?Ist es jemals in Ordnung, einen java.lang.Error zu werfen?

+0

Sollte nicht Fehler, aber einige geeignete Unterklasse, entweder bestehende oder eine Sie definieren verwenden System.exit zu verlassen. Aber eine Unterklasse von Error ist in Ihrer Situation angemessen. –

Antwort

4

Die nurError die ich regelmäßig in Business-Code verwendet habe, ist ExceptionInInitializerError. In static Initialisierungsbausteinen haben Sie keine andere Wahl.

Aber selbst wenn Sie das in eine Webapplikation werfen, würde die Webapplikation weiterhin HTTP-Anfragen abhören. Ihre beste Wette ist, das Laden oder Initialisieren des Moduls in einem Filter hören auf einem url-pattern/* und lassen Sie die Filter die HTTP-Anforderungen entsprechend blockieren. Z.B.

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

Dies würde einen HTTP 500-Fehler mit der angegebenen Nachricht ergeben.

1

Nicht sicher, wie genau, aber OSGi hat eine Abhängigkeitsverwaltung von Bundles (= Plugins ähnlich). Ein Bündel wird erst geladen, wenn ein anderes Bündel bereit ist. Vielleicht können Sie den gleichen Mechanismus verwenden (oder einfach OSGi selbst verwenden;)), um auf ein Plugin/eine Anwendung zu warten, bis ein anderes Plugin bereit ist. Oder Sie beenden die Anwendung während des Startvorgangs, wenn Sie Ihr Plugin nicht richtig finden/laden können.

+0

Scheint wie der Hammer aller Nägel, aber wie OSGi, ich neige zu zustimmen. Außerdem sollte jede Art von Abhängigkeitsverwaltung funktionieren (IoC, Sie nennen es). – Riduidel

-1

das Fehlerprotokoll, und dann einfach die Anwendung

+0

Das gibt keinen Hinweis (über den Rückgabecode hinaus), warum die App fehlgeschlagen ist. –

+0

@HotLicks Ich habe einen Vorschlag hinzugefügt, um zuerst den Fehler zu protokollieren und dann zu beenden. – Demi

Verwandte Themen