Question

Je travaille sur une application multiplate-forme en Java qui fonctionne actuellement bien sous Windows, Linux et MacOS X. J'essaie de trouver un moyen agréable de détecter (et de gérer) les "crashs". Existe-t-il un moyen simple et multi-plateforme de détecter les "crashs" en Java et de réagir en conséquence?

Je suppose que par "crash", je veux dire des exceptions non appréhendées. Cependant, le code utilise certains JNI, donc ce serait bien d’être en mesure d’attraper les accidents de mauvais code JNI, mais j’ai le sentiment que c’est spécifique à la JVM.

Était-ce utile?

La solution

Pour une manipulation simple, vous pouvez utiliser la méthode statique suivante dans Discussion . Depuis le Javadoc:

  

static void setDefaultUncaughtExceptionHandler ( Thread.UncaughtExceptionHandler eh)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp à une exception non capturée, et aucun autre gestionnaire n'a été défini pour ce thread.

Il s'agit d'un moyen très large de traiter les erreurs ou les exceptions non contrôlées qui ne peuvent être détectées nulle part ailleurs.

Remarque secondaire: Il est préférable que le code puisse intercepter, consigner et / ou récupérer des exceptions plus proches de la source du problème. Je réserverais ce type de gestion généralisée des incidents irrécupérables (par exemple, les sous-classes de java.lang.Error ). Essayez d'éviter la possibilité d'une Exécution RuntimeException . jamais complètement pris au dépourvu, car il serait peut-être possible - et préférable - que le logiciel survive à cela.

Autres conseils

Pour gérer les exceptions non capturées, vous pouvez fournir un nouveau ThreadGroup qui fournit une implémentation de ThreadGroup.uncaughtException (...). Vous pouvez ensuite intercepter toutes les exceptions non interceptées et les gérer correctement (par exemple, envoyer un journal des incidents à la maison).

Je ne peux pas vous aider sur le front de JNI, il existe probablement un moyen d’utiliser un exécutable de wrapper natif avant d’appeler la machine virtuelle, mais cet exécutable devra connaître toutes les machines JVM possibles qu’il pourrait appeler et les plantages et où les journaux de crash sont placés, etc.

Vous ne savez pas si c'est ce dont vous avez besoin, mais vous pouvez également détecter si une exception s'est produite dans votre code natif. Voir http: //java.sun .com / javase / 6 / docs / technotes / guides / jni / spec / functions.html # wp5234 pour plus d’informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top