IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

try finally w.r.t System.exit


Sujet :

Langage Java

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Février 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 190
    Points : 153
    Points
    153
    Par défaut try finally w.r.t System.exit
    Bonjour,

    Dans mon esprit, un bloc finally était toujours exécuté. L'exemple suivant me fait douter...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
    System.exit(0);
    } finally {
     System.out.print("hello");
    }
    .


    Ma question est donc où et comment faire l'appel à exit quand il y a du boulot à faire à la fermeture du programme (typiquement des close sur des canaux)?

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2012
    Messages
    3 020
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3 020
    Points : 16 092
    Points
    16 092
    Par défaut
    AMHA, le est à proscrire.

    Pour la simple et bonne raison que si tu as bien géré tes exceptions, tu peux quitter ton traitement proprement, en ayant tout bien fermé tes ressources, loggué l'erreur pour permettre de comprendre où et quand ton traitement à planté, etc...

    En général, la bonne pratique veut que tu fasses quelque chose du genre:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try{
      //tu ouvres tes ressources
     
    }
    catch(tonException1 e){
       // logguer
       // mettre un flag pour dire que ça à planté
       // ...
    }
    finally{
       // fermer les ressources qui nécessitent d'être fermées
    }

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par LGnord Voir le message
    Bonjour,

    Dans mon esprit, un bloc finally était toujours exécuté.
    Ha non, il est toujours exécuté à la sortie d'une bloc try/catch. en l'occurence ici, tu est dans un des trois cas(enfin je n'en connait que trois) où l'on ne sort jamais du bloc try

    -> Si on sort de la jvm avec un System .exit -> le finally n'est pas exécuté, on arrive jamais jusque là
    -> Si le code à l'intérieur du try / catch n'ent fini jamais de s'exécuter
    -> Si la jvm crashe
    Ma question est donc où et comment faire l'appel à exit quand il y a du boulot à faire à la fermeture du programme (typiquement des close sur des canaux)?
    Le plus propre: plus haut dans la pile. Par exemple en remontant une exception custom de type ApplicationShutdown.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args){
       try {
        // ton code applicatif
       } catch (ApplicationShutdownException e){
         System.exit(e.getExitCode());
       }
    }
    Ceci dit, la fermeture des canaux n'est en général pas trop un soucis si tu veux sortir de ton application: tous les handles possédés par ton application vont être fermé par l'OS lors de ton exit

    Le System.exit dans le code, a quand même un gros incovénient: les unit tests sont ch*** à écrire après

  4. #4
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Carhiboux Voir le message
    En général, la bonne pratique veut que tu fasses quelque chose du genre:

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    try{
      //tu ouvres tes ressources
     
    }
    catch(tonException1 e){
       // logguer
       // mettre un flag pour dire que ça à planté
       // ...
    }
    finally{
       // fermer les ressources qui nécessitent d'être fermées
    }
    Perso je conseillerais plutôt le pattern suivant, pour chaque ressource :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Ouverture de la ressource
    try {
    	// Traitement sur la ressource
    } finally {
    	// Libération de la ressource
    }
    Le tout entouré d'un bloc try/catch si l'on souhaite traité les exceptions.

    Ou le try-with-ressource de Java 7 bien sûr (qui se base sur ce pattern)



    Citation Envoyé par tchize_ Voir le message
    Le System.exit dans le code, a quand même un gros incovénient: les unit tests sont ch*** à écrire après
    Ca peut même être très dangereux lorsque ca traine dans une librairie utilisé dans une application serveur...


    a++

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Citation Envoyé par adiGuba Voir le message

    Ca peut même être très dangereux lorsque ca traine dans une librairie utilisé dans une application serveur...
    Moyennement dangereux, la spec J2EE dit que le serveur doit refuser les appels à System.exit (typiquement via le securitymanager)

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    @tchize_ : j'ai déjà vu des serveurs J2EE s'arrêter à cause de cela
    (remarque : ils ne respectaient peut-être pas les specs)

    Mais sinon plus globalement "application serveur" ne signifie pas obligatoirement "J2EE" (même si c'est probablement le plus courant).


    a++

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    De fait ^^

    J'ai personellement vu une libriarie faire un System.out.close(). C'est très drôle aussi dans un serveur. On a mis des jours comprendre pourquoi le serveur arrêtait abrutement de donner des message dans le log

Discussions similaires

  1. System.exit(0) 0 ?
    Par cyrano_de_bergerac dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 23/05/2007, 14h47
  2. [D7]Problème Try Finally End
    Par delphi5user dans le forum Delphi
    Réponses: 12
    Dernier message: 17/04/2007, 16h37
  3. Réponses: 9
    Dernier message: 12/03/2007, 23h43
  4. [JFrame]System.exit() lors du clic sur la croix
    Par cyrill.gremaud dans le forum Agents de placement/Fenêtres
    Réponses: 21
    Dernier message: 17/08/2006, 10h48
  5. Des conséquences du try...finally
    Par fulster dans le forum Langage
    Réponses: 3
    Dernier message: 15/03/2006, 01h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo