J'ai un module de plugin qui va dans une application web. Si le module ne se charge pas correctement, il n'est pas logique que l'application Web continue, et l'application Web ne devrait probablement pas charger du tout, nous préférerions que ce module s'initialise correctement toujours. Si je devais lancer une exception d'exécution, il entrerait dans les logs, et serait simplement ignoré puisque l'application continuerait de toute façon, et les utilisateurs finaux ne sauraient jamais ... Je sais que les erreurs sont censées être lancées seulement sous conditions exceptionnelles, et ils ont généralement à faire avec des situations que le système ne peut pas récupérer, mais que feriez-vous dans une telle situation?Est-il toujours possible de lancer java.lang.Error?
Répondre
Le seulementError
que j'ai régulièrement utilisé dans le code commercial est ExceptionInInitializerError
. Vous n'avez pas d'autre choix dans les blocs d'initialisation static
. Mais même si vous le lancez dans une application web, l'application web continuerait à écouter sur les requêtes HTTP. Votre meilleur pari est de faire le chargement ou l'initialisation du module à l'intérieur d'un Filter
en écoutant un url-pattern
de /*
et laissez le Filter
bloquer les requêtes HTTP en conséquence. Par exemple.
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.");
}
}
Ceci produirait une erreur HTTP 500 avec le message donné.
Vous ne savez pas exactement comment mais OSGi a obtenu une gestion des dépendances de bundles (= similaire aux plugins). Un paquet ne se charge pas jusqu'à ce qu'un autre paquet soit prêt. Peut-être que vous pouvez utiliser ce même mécanisme (ou simplement utiliser OSGi lui-même;)) pour attendre un plugin/application jusqu'à ce qu'un autre plugin soit prêt. Ou vous arrêtez l'application au démarrage si elle ne peut pas trouver/charger votre plugin correctement.
Semble comme le marteau de tous les ongles, mais étant friands d'OSGi, j'ai tendance à approvde. En outre, tout type de mécanisme de gestion des dépendances devrait fonctionner (IoC, vous l'appelez). – Riduidel
Se connecter l'erreur, et ensuite utiliser System.exit pour quitter simplement l'application
Cela ne donne aucune indication (au-delà du code de retour) indiquant pourquoi l'application a échoué. –
@HotLicks J'ai ajouté une suggestion pour d'abord se connecter l'erreur, puis quitter. – Demi
- 1. Est-il possible de lancer un sort Une gamme
- 2. Est-il possible de lancer une exception MessageQueueException?
- 3. Est-il possible de lancer automatiquement le céleri au démarrage?
- 4. HibernateTransactionManager: possible de lancer une exception sans restauration?
- 5. Problème de type lancer
- 6. Est-il possible de lancer un shell Paster avec des modules pré-importés?
- 7. Lancer l'image
- 8. Possible d'utiliser SaveVideoAtPathToSavedPhotosAlbum et toujours maintenir la rétrocompatibilité 3.0?
- 9. Je veux lancer un programme sans utiliser de terminal - est-ce possible? Comment?
- 10. CLR: Si un constructeur échoue, va-t-il toujours lancer une exception?
- 11. Est-ce que lancer un objet en C# retourne toujours une référence à l'objet initial?
- 12. Impossible de lancer l'objet
- 13. Est-il possible de lancer seekBar OnSeekBarChangeListener à partir d'une autre vue (différente de ma seekBar)?
- 14. Possible de lancer l'applet JWS dans le navigateur au lieu de autonome?
- 15. lancer; jeter ex; optimal
- 16. Est-il possible de lancer un script php au démarrage d'apache?
- 17. Est-il possible de lancer une application depuis une autre application iPhone?
- 18. Est-il possible de lancer un processus Java sous Windows Service avec C#?
- 19. Est-il possible de lancer un objet SimpleXML vers un objet DOMDocument en PHP?
- 20. Est-il possible de lancer une activité Android à partir d'un AlertDialog?
- 21. Possible de lancer uniquement une tâche planifiée si un raccourci/bouton est cliqué?
- 22. click() lancer plusieurs fois
- 23. Lancer un processus TopMost
- 24. Lancer des objets dans JRuby
- 25. Lancer 401 dans MVC2
- 26. java.lang.Error: "Il n'y a pas assez de mémoire disponible pour traiter cette commande" lors de la génération des images
- 27. Comment lancer webkit sur Windows?
- 28. Entité de ressort pour utiliser le service, défaut de conception possible, mais toujours
- 29. Est-il possible de forcer jQuery.jScrollPane à toujours afficher une barre de défilement verticale?
- 30. Est-il possible que la liste déroulante de l'élément de sélection apparaisse toujours vers le bas?
ne devrait être erreur, mais une sous-classe appropriée, soit existant ou que vous définissez. Mais lancer une sous-classe d'Erreur est approprié dans votre situation. –