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?
Antwort
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.
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.
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
das Fehlerprotokoll, und dann einfach die Anwendung
Das gibt keinen Hinweis (über den Rückgabecode hinaus), warum die App fehlgeschlagen ist. –
@HotLicks Ich habe einen Vorschlag hinzugefügt, um zuerst den Fehler zu protokollieren und dann zu beenden. – Demi
- 1. Ist es in Ordnung, einen Std :: Bad_alloc manuell zu werfen?
- 2. In C, ist es jemals sicher, einen Variadic-Funktionszeiger auf einen Funktionszeiger mit endlichen Argumenten zu werfen?
- 3. Ist es in Ordnung, einen Fremdschlüssel als Primärschlüssel zu haben?
- 4. Ist es in Ordnung, einen ListView-Adapter dynamisch zu ändern?
- 5. Ist es in Ordnung, mit() zu verwenden?
- 6. Ist es in Ordnung, eine Ausnahme zu instanziieren, ohne sie zu werfen?
- 7. Ist es in Ordnung, eine anwendungsspezifische Ausnahme aus einer benutzerdefinierten gemeinsam genutzten Bibliothek zu werfen?
- 8. Ist es in Ordnung, NotImplemented Exception in virtuellen Methoden zu werfen?
- 9. Ist es in Ordnung, downcast?
- 10. Ist es sicher zu werfen volatile?
- 11. Ist es in Ordnung, einen Durchgang vom Hauptfaden durchzuführen?
- 12. Ist es in Ordnung HTML in HTML-Attribute zu setzen?
- 13. Ist es in Ordnung, einen Datenbankinitialisierungsaufruf in einen C# -Konstruktor zu versetzen?
- 14. Ist es in Ordnung, UITableViewCells in einem Array zu speichern?
- 15. Ist es in Ordnung, RabbitMQ `/` VHost zu löschen?
- 16. Ist es in Ordnung, ein leeres Anker-Tag zu haben?
- 17. Wann ist es in Ordnung, "abgeschlossene" Gerätetests zu ändern?
- 18. Ist es in Ordnung, Docker aus dem Andockfenster zu starten?
- 19. Ist es in Ordnung, mehrere Dispatcher.BeginInvoke zu haben?
- 20. Ist es in Ordnung, HTTP-Redirect-Bilder zu übertragen?
- 21. GruntJS und imagemin, Ist es in Ordnung, 'src' zu überschreiben?
- 22. ist es in Ordnung, Leute ohne Javascript zu vergessen?
- 23. Ist es in Ordnung, einen Verweis auf eine Azure CloudTable für einen längeren Zeitraum zu halten?
- 24. Ist es in Ordnung, divs in einer Tabellenzelle zu verschachteln?
- 25. Ist es in Ordnung, Rendering in React zu delegieren?
- 26. Ist es in Ordnung, widersprüchliche Einschränkungen in Xcode zu ignorieren?
- 27. Ist es in Ordnung, einige IDs in HTML zu zeigen?
- 28. ist es in Ordnung, Vektor in einem Destruktor zu löschen
- 29. Ist es in Ordnung, SQL-Statistiken zu löschen?
- 30. Core Data Vererbung: Ist es in Ordnung, dies zu tun?
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. –