Portail / Client JavaFX(Sommaire)

Gestion des erreurs.

piDOC est une application d'une certain complexité qui met en oeuvre des communications et s'appuie sur des ressources physiques (système de fichier local par exemple).

Pourquoi il n'est pas possible de circonscrire les erreurs ?

Vaste question...

La réponse courte est que sur les systèmes complexes on utlise des ressources logicielles et physiques partagées. Ces ressources peuvent rencontrées des difficultés qui impactent plus ou moins fortement les logiciels qui les utilisent. Par exemple, le système de fichier local peut être saturé ou le réseau peut être innaccessible (panne d'un routeur par exemple). Sur ces éléments le client piDOC n'a pas d'action et sera forcément impacté par de tels dysfonctionnements. C'est pourqoui ils doivent être pris en compte dès la conception des applications.

Dans la pratique, il peut arriver deux types d'erreurs :

  1. les erreurs liés à une erreur de logique dans le développement (le fameux bug) ;
  2. l'échec de l'accès à une ressource distante ou locale.

Présentation du journal.

En général, lorsqu'une erreur interdit la poursuite d'une action de l'utilisateur, une fenêtre vous en avertit. Voici un exemple ci-dessous :

Erreur rencontrée.

L'utilisateur est avertit qu'il y a un problème mais il est possible que les conditions qui ont conduit à cette erreur doivent être résolues par une action d'administration. Il aura alors beau ré-essayer, il obtiendra toujours la même erreur.

Fort heureusement, le client JFX piDOC dispose d'un fichier journal déclaré dans son fichier de configuration. Ce journal dispose d'un filtre qui permet de limiter le nombre de traces. En production, ce filtre est warning (avertissement). Tous les avertissements et erreurs seront enregistrés avec ce filtre.

Le journal livre beaucoup plus de détails sur la nature de la difficulté rencontrée. Voici par exemple ce qu'il décrit à propos de l'avertissement précédent :

20/04/21 11:57:44 CEST [1618912664209]  > [Erreur] [Technique] [Erreur : java.nio.file.NoSuchFileException, classe : sun.nio.fs.UnixException, méthode : translateToIOException, Nom de fichier : UnixException.java (86)] (java.nio.file.NoSuchFileException) /var/pidoc/jfx/tmp/pidoc/cache
  -->(java.nio.file.NoSuchFileException) /var/pidoc/jfx/tmp/pidoc/cache
        at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
        at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
        at sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:427)
        at java.nio.file.Files.newDirectoryStream(Files.java:457)
        at java.nio.file.Files.list(Files.java:3451)
        at eu.piapplications.pidoc.jfx.Configuration.getProspectiveDocumentsInCache(Configuration.java:1567)
        at eu.piapplications.pidoc.jfx.controller.FXMLNewDocumentsController.readSerializedProspectiveDocuments(FXMLNewDocumentsController.java:784)
        at eu.piapplications.pidoc.jfx.controller.FXMLNewDocumentsController.initGui(FXMLNewDocumentsController.java:1041)
        at eu.piapplications.pidoc.jfx.controller.FXMLNewDocumentsController.initialize(FXMLNewDocumentsController.java:1068)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2548)
        at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2441)
        at javafx.fxml.FXMLLoader.load(FXMLLoader.java:2409)
        at eu.piapplications.pidoc.jfx.controller.FXMLClassificationController.handleNewDocumentsAdding(FXMLClassificationController.java:197)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
        at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
        at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1769)
        at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.control.MenuItem.fire(MenuItem.java:462)
        at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.doSelect(ContextMenuContent.java:1405)
        at com.sun.javafx.scene.control.skin.ContextMenuContent$MenuItemContainer.lambda$createChildren$343(ContextMenuContent.java:1358)
        at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
        at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
        at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
        at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
        at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
        at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
        at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
        at javafx.event.Event.fireEvent(Event.java:198)
        at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
        at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
        at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
        at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:394)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:432)
        at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
        at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:431)
        at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
        at com.sun.glass.ui.View.notifyMouse(View.java:937)
        at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
        at com.sun.glass.ui.gtk.GtkApplication.lambda$null$48(GtkApplication.java:139)
        at java.lang.Thread.run(Thread.java:748)
20/04/21 12:30:13 CEST [1618914613290]  > [Avertissement] [Indéfini] 4 fichiers ont été rejetés. Veuillez lire la liste des noms et causes ci-dessous.
  -->/home/jm/Documents/Conseil municipal/secrétariat/Cosoluce/D35-2012-VL3476_PARCE_PRESTATIONS AU DEMARRAGE.pdf -> Echec de la mise en cache du futur document.
        /home/jm/Documents/Conseil municipal/secrétariat/Cosoluce/D35-2011-VL3468_PARCE_PRESTATIONS AU DEMARRAGE.pdf -> Echec de la mise en cache du futur document.
        /home/jm/Documents/Conseil municipal/secrétariat/Cosoluce/D35-2101-VL433_PARCE ABONNEMENT PRODUIT COSOLUCE.pdf -> Echec de la mise en cache du futur document.
        /home/jm/Documents/Conseil municipal/secrétariat/Cosoluce/20201130-PTT-Acquittement devis.pdf -> Echec de la mise en cache du futur document.

Dans notre exemple, il est assez facile d'en déduire que le répertoire de cache déclaré n'existe pas ou plus.

Si vous bénéficiez d'un support PiApplications, vous aurez probablement à transmettre ce journal.

Rédaction par Jean-Marie Piatte (1983-2021)